V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WEBUG
V2EX  ›  Java

jpa 写的增删改查项目,能实现不改代码,动态添加表维护吗?

  •  
  •   WEBUG · 2021-02-25 10:16:06 +08:00 · 3860 次点击
    这是一个创建于 1127 天前的主题,其中的信息可能已经有所发展或是发生改变。
    维护一个 spring 项目 用的 jpa,好多繁琐的表维护界面,经常有新需求,无非就是加一个新表增删改查。代码很重复,有没有什么技术实现线上自动创建表,直接实现增删改查的方法。
    第 1 条附言  ·  2021-02-25 10:53:05 +08:00
    不是代码生成器,生成器已经在用了。
    是想用户直接可以在页面上配置新的表,就可以直接多出一个维护页面。
    省去为了加一个表又重新打包发布一遍工程这个步骤
    41 条回复    2021-03-03 18:28:11 +08:00
    nothingLeft
        1
    nothingLeft  
       2021-02-25 10:19:44 +08:00   ❤️ 1
    我们都是增删改查程序员,干嘛自己干掉自己!
    asd999cxcx
        2
    asd999cxcx  
       2021-02-25 10:21:07 +08:00
    自动创建表?JPA 不就是项目启动后自动创建表吗...
    WEBUG
        3
    WEBUG  
    OP
       2021-02-25 10:25:20 +08:00
    @asd999cxcx #2 这样的项目启动后,突然有需求要加一个 a 表,这个表是新的,没有 entity 也没有增删改查的方法,通过一个网页把 a 的属性都写好,自动创建这个表,系统就多出来一个维护界面,可以操作这个表了。原来的操作是,添加一套增删改查的代码再发布。
    WEBUG
        4
    WEBUG  
    OP
       2021-02-25 10:26:22 +08:00
    @nothingLeft #1 这么一说还有点道理,这不是想把自己从繁琐无聊的工作中解放出来吗,虽然可以自动生成代码了,还想更近一步
    RedBeanIce
        5
    RedBeanIce  
       2021-02-25 10:31:07 +08:00
    CRUD 的革命。
    mhycy
        6
    mhycy  
       2021-02-25 10:41:50 +08:00
    自己造一个基于配置的表单生成模块
    WEBUG
        7
    WEBUG  
    OP
       2021-02-25 10:43:06 +08:00
    @mhycy #6 有没有类似的开源项目
    LostPrayers
        8
    LostPrayers  
       2021-02-25 10:43:39 +08:00
    代码生成器? 那些 xx 开发框架不是到处都是嘛
    FreeEx
        9
    FreeEx  
       2021-02-25 10:46:04 +08:00
    jpa 做不到你的需求,看你说的好像流程很简单,可以自己实现一个 orm,创建表无非就是 create table xxx,然后 crud
    superrichman
        10
    superrichman  
       2021-02-25 10:46:40 +08:00 via iPhone
    phpmyadmin 🐶
    WEBUG
        11
    WEBUG  
    OP
       2021-02-25 10:48:27 +08:00
    @superrichman #10 你这也太好用了
    EscYezi
        12
    EscYezi  
       2021-02-25 10:49:05 +08:00 via iPhone
    不修改代码的话重启服务修改就没了,除非有一套机制重新走一遍初始化过程。感觉搞一个 generator 自动生成 java 代码和页面更简单。
    WEBUG
        13
    WEBUG  
    OP
       2021-02-25 10:49:25 +08:00
    @LostPrayers #8 不是生成器
    WEBUG
        14
    WEBUG  
    OP
       2021-02-25 10:54:25 +08:00
    @EscYezi #12 自动生成已经在用,能实现一次 就可以存起来,不怕重启服务
    echowuhao
        15
    echowuhao  
       2021-02-25 10:55:19 +08:00
    postgrest 不过这个不是 jpa 了。
    WEBUG
        16
    WEBUG  
    OP
       2021-02-25 10:58:15 +08:00
    @echowuhao #15 看着也可以,应该有类似的不依赖数据库的项目吧,不是 jpa 的也可以。
    mhycy
        17
    mhycy  
       2021-02-25 11:01:16 +08:00
    @WEBUG
    了解范围内没有,但自己按 JSON 条件来动态生成前端问题不大
    后端方面就看看 JAVA 有没有能力做到动态 ORM 了,如果有的话还是能做到
    yeqizhang
        18
    yeqizhang  
       2021-02-25 11:01:30 +08:00
    不就是后台 ddl 吗,肯定有这类开源工具包的。如果只是固定的数据库类型,自己写个也不难
    WEBUG
        19
    WEBUG  
    OP
       2021-02-25 11:11:13 +08:00
    @mhycy #17 不知道 java 反射可不可以,有空我去试试,主要就是 java 这边,前台确实容易
    jjianwen68
        20
    jjianwen68  
       2021-02-25 11:13:10 +08:00
    把 jpa 启动时,自动创建表的逻辑手工调用一遍 ?
    WEBUG
        21
    WEBUG  
    OP
       2021-02-25 11:15:56 +08:00
    @jjianwen68 #20 jpa 启动建表的话 entity 什么的实体类应该要有吧不太清楚,现在是连 entity 都没有,新增的表在代码里没有任何存在。
    huifer
        22
    huifer  
       2021-02-25 12:32:01 +08:00
    前端页面不一定是单表 CRUD,每个输入框的验证逻辑等如何输入
    chainsR
        23
    chainsR  
       2021-02-25 12:57:17 +08:00 via Android
    人人开源?
    huifer
        24
    huifer  
       2021-02-25 13:34:30 +08:00
    @Autowired
    private OauthClientService oauthClientService;
    @Autowired
    private EntityManager entityManager;
    @Test
    public void testSession() {
    Query query = entityManager.createNativeQuery("SELECT id from oauth_client");
    DetachedCriteria criteria = DetachedCriteria.forClass(Object.class)
    // 这里需要类型绑定,通过数据库类型和 JAVA 类型进行转换
    .add(Property.forName("id")
    .eq(5L));
    String s = criteria.toString();
    EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
    Session session = sessionFactory.openSession();

    Criteria executableCriteria = criteria.getExecutableCriteria(session);
    List list = executableCriteria.list();
    }

    @WEBUG JPA 层面代码.
    linbingcheng
        25
    linbingcheng  
       2021-02-25 13:56:39 +08:00
    jpa 我最近感觉不大好用,还不如 mybatis 呢
    oneisall8955
        26
    oneisall8955  
       2021-02-25 14:21:01 +08:00
    老铁想说的是 jpa 的 lowcode 框架?
    dfzj
        27
    dfzj  
       2021-02-25 15:05:10 +08:00   ❤️ 1
    老铁,增删改查还是用无远吧:www.wuyuan.io
    guagusi
        28
    guagusi  
       2021-02-25 15:11:17 +08:00
    基于元数据设计数据模型
    WEBUG
        29
    WEBUG  
    OP
       2021-02-25 15:22:01 +08:00
    @oneisall8955 #26 就是这意思,java 就行,如果 jpa 真实现不了
    clf
        30
    clf  
       2021-02-25 15:42:42 +08:00
    这玩意很多……只是通过 JPA CRUD 就行了,没必要通过 JPA 建表。

    可以考虑 sql 语句建表后根据数据库自动生成这个表的 CRUD 和实体类,这样可能会更好处理一点。
    LarryWang
        31
    LarryWang  
       2021-02-25 17:34:24 +08:00
    用 excel 吧
    zypy333
        32
    zypy333  
       2021-02-25 17:59:07 +08:00
    我这有个类似的实现,就是有若干系统模块,功能类似,字段不多,也没有什么复杂查询,单独建表开发感觉很繁琐,又有些公共属性,最后统一用了一张表来存储实际数据,多加了些通用字段,另外一张表记录模块配置,表里用 json 记录下不同的模块下通用字段的实际展示名称,实际表单类型,是否必须等等,最后展示的时候用的同一个界面做的增删改查.
    lostpupil
        33
    lostpupil  
       2021-02-25 18:03:35 +08:00
    原理上就是 调用 create_table
    然后 crud 找个 随便什么框架就行,graphql 也可以,不过有的可能需要重启 reload 。
    不过这个其实你用 doc database 就很方便。
    mongodb 什么的。
    shade
        34
    shade  
       2021-02-25 21:34:54 +08:00
    父子关系表如何处理呢?
    ErrorMan
        35
    ErrorMan  
       2021-02-25 23:10:45 +08:00
    反向操作是可以的,每次增加一个新的 entity,然后启动程序让 jpa 自己根据 entity 创建或更新表结构,前端 API 可以用 REST Repository 配合 REST api 直接提供给前端,然后前端根据 spring HATEOAS 路径去获得完整数据结构路径提供相关操作。大概的缺陷就是不好加鉴权吧,鉴权就得介入代码了
    xuanbg
        36
    xuanbg  
       2021-02-26 08:37:02 +08:00   ❤️ 1
    尽管我很反对 GraphQL,但这种需求,就是 GraphQL 的菜。
    ZiLong
        37
    ZiLong  
       2021-02-26 10:32:55 +08:00
    你是不是想要 jhipster 或者
    jeecg-boot 这种?
    WEBUG
        38
    WEBUG  
    OP
       2021-02-26 10:44:32 +08:00
    @xuanbg #36 有点这个感觉了,我研究研究
    hantsy
        39
    hantsy  
       2021-02-26 12:01:32 +08:00
    JPA 标准支持很多创建和维护表。https://github.com/hantsy/cargotracker/blob/master/src/main/resources/META-INF/persistence.xml#L9-L30 这个配置我写了常见的使用的几个例子。具体的参数,可以参考任何一本 JPA 书籍( Pro JPA2,Java Persistence with Hibernate ),或者规范文件,或者官方的 Jakarta EE Tutorial 。

    不过一般生产环境上线都是经过优化过的脚本运行来创建表,生产环境我从来不主张用自动创建维护表。或者自己用 Flyway 之类的维护脚本更稳妥一些。
    bthulu
        40
    bthulu  
       2021-02-26 13:16:05 +08:00
    动态生成 entity 和 dao 层的.java 文件, 并自动提交到 git 仓库, 触发构建部署就行了
    liian2019
        41
    liian2019  
       2021-03-03 18:28:11 +08:00
    1. 获取数据库表结构,做成配置保存
    2. 从配置表读取配置,利用 javassist/asm 生成 pojo,mapper 等等类的 class 加载到虚拟机
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3152 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:39 · PVG 20:39 · LAX 05:39 · JFK 08:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.