jpa 写的增删改查项目,能实现不改代码,动态添加表维护吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WEBUG
V2EX    Java

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

  •  
  •   WEBUG 2021-02-25 10:16:06 +08:00 4659 次点击
    这是一个创建于 1691 天前的主题,其中的信息可能已经有所发展或是发生改变。
    维护一个 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 呢
    itechify
        26
    itechify  
    PRO
       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
    &nbs;  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     Solana     5526 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 07:31 PVG 15:31 LAX 00:31 JFK 03:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86