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

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

  •  
  •   WEBUG · 284 天前 · 2836 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。
    维护一个 spring 项目 用的 jpa,好多繁琐的表维护界面,经常有新需求,无非就是加一个新表增删改查。代码很重复,有没有什么技术实现线上自动创建表,直接实现增删改查的方法。
    第 1 条附言  ·  284 天前
    不是代码生成器,生成器已经在用了。
    是想用户直接可以在页面上配置新的表,就可以直接多出一个维护页面。
    省去为了加一个表又重新打包发布一遍工程这个步骤
    41 条回复    2021-03-03 18:28:11 +08:00
    nothingLeft
        1
    nothingLeft  
       284 天前   ❤️ 1
    我们都是增删改查程序员,干嘛自己干掉自己!
    asd999cxcx
        2
    asd999cxcx  
       284 天前
    自动创建表?JPA 不就是项目启动后自动创建表吗...
    WEBUG
        3
    WEBUG  
    OP
       284 天前
    @asd999cxcx #2 这样的项目启动后,突然有需求要加一个 a 表,这个表是新的,没有 entity 也没有增删改查的方法,通过一个网页把 a 的属性都写好,自动创建这个表,系统就多出来一个维护界面,可以操作这个表了。原来的操作是,添加一套增删改查的代码再发布。
    WEBUG
        4
    WEBUG  
    OP
       284 天前
    @nothingLeft #1 这么一说还有点道理,这不是想把自己从繁琐无聊的工作中解放出来吗,虽然可以自动生成代码了,还想更近一步
    RedBeanIce
        5
    RedBeanIce  
       284 天前
    CRUD 的革命。
    mhycy
        6
    mhycy  
       284 天前
    自己造一个基于配置的表单生成模块
    WEBUG
        7
    WEBUG  
    OP
       284 天前
    @mhycy #6 有没有类似的开源项目
    LostPrayers
        8
    LostPrayers  
       284 天前
    代码生成器? 那些 xx 开发框架不是到处都是嘛
    FreeEx
        9
    FreeEx  
       284 天前
    jpa 做不到你的需求,看你说的好像流程很简单,可以自己实现一个 orm,创建表无非就是 create table xxx,然后 crud
    superrichman
        10
    superrichman  
       284 天前 via iPhone
    phpmyadmin 🐶
    WEBUG
        11
    WEBUG  
    OP
       284 天前
    @superrichman #10 你这也太好用了
    EscYezi
        12
    EscYezi  
       284 天前 via iPhone
    不修改代码的话重启服务修改就没了,除非有一套机制重新走一遍初始化过程。感觉搞一个 generator 自动生成 java 代码和页面更简单。
    WEBUG
        13
    WEBUG  
    OP
       284 天前
    @LostPrayers #8 不是生成器
    WEBUG
        14
    WEBUG  
    OP
       284 天前
    @EscYezi #12 自动生成已经在用,能实现一次 就可以存起来,不怕重启服务
    echowuhao
        15
    echowuhao  
       284 天前
    postgrest 不过这个不是 jpa 了。
    WEBUG
        16
    WEBUG  
    OP
       283 天前
    @echowuhao #15 看着也可以,应该有类似的不依赖数据库的项目吧,不是 jpa 的也可以。
    mhycy
        17
    mhycy  
       283 天前
    @WEBUG
    了解范围内没有,但自己按 JSON 条件来动态生成前端问题不大
    后端方面就看看 JAVA 有没有能力做到动态 ORM 了,如果有的话还是能做到
    yeqizhang
        18
    yeqizhang  
       283 天前
    不就是后台 ddl 吗,肯定有这类开源工具包的。如果只是固定的数据库类型,自己写个也不难
    WEBUG
        19
    WEBUG  
    OP
       283 天前
    @mhycy #17 不知道 java 反射可不可以,有空我去试试,主要就是 java 这边,前台确实容易
    jjianwen68
        20
    jjianwen68  
       283 天前
    把 jpa 启动时,自动创建表的逻辑手工调用一遍 ?
    WEBUG
        21
    WEBUG  
    OP
       283 天前
    @jjianwen68 #20 jpa 启动建表的话 entity 什么的实体类应该要有吧不太清楚,现在是连 entity 都没有,新增的表在代码里没有任何存在。
    huifer
        22
    huifer  
       283 天前
    前端页面不一定是单表 CRUD,每个输入框的验证逻辑等如何输入
    chainsR
        23
    chainsR  
       283 天前 via Android
    人人开源?
    huifer
        24
    huifer  
       283 天前
    @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  
       283 天前
    jpa 我最近感觉不大好用,还不如 mybatis 呢
    oneisall8955
        26
    oneisall8955  
       283 天前
    老铁想说的是 jpa 的 lowcode 框架?
    dfzj
        27
    dfzj  
       283 天前   ❤️ 1
    老铁,增删改查还是用无远吧:www.wuyuan.io
    guagusi
        28
    guagusi  
       283 天前
    基于元数据设计数据模型
    WEBUG
        29
    WEBUG  
    OP
       283 天前
    @oneisall8955 #26 就是这意思,java 就行,如果 jpa 真实现不了
    clf
        30
    clf  
       283 天前
    这玩意很多……只是通过 JPA CRUD 就行了,没必要通过 JPA 建表。

    可以考虑 sql 语句建表后根据数据库自动生成这个表的 CRUD 和实体类,这样可能会更好处理一点。
    LarryWang
        31
    LarryWang  
       283 天前
    用 excel 吧
    zypy333
        32
    zypy333  
       283 天前
    我这有个类似的实现,就是有若干系统模块,功能类似,字段不多,也没有什么复杂查询,单独建表开发感觉很繁琐,又有些公共属性,最后统一用了一张表来存储实际数据,多加了些通用字段,另外一张表记录模块配置,表里用 json 记录下不同的模块下通用字段的实际展示名称,实际表单类型,是否必须等等,最后展示的时候用的同一个界面做的增删改查.
    lostpupil
        33
    lostpupil  
       283 天前
    原理上就是 调用 create_table
    然后 crud 找个 随便什么框架就行,graphql 也可以,不过有的可能需要重启 reload 。
    不过这个其实你用 doc database 就很方便。
    mongodb 什么的。
    shade
        34
    shade  
       283 天前
    父子关系表如何处理呢?
    ErrorMan
        35
    ErrorMan  
       283 天前
    反向操作是可以的,每次增加一个新的 entity,然后启动程序让 jpa 自己根据 entity 创建或更新表结构,前端 API 可以用 REST Repository 配合 REST api 直接提供给前端,然后前端根据 spring HATEOAS 路径去获得完整数据结构路径提供相关操作。大概的缺陷就是不好加鉴权吧,鉴权就得介入代码了
    xuanbg
        36
    xuanbg  
       283 天前   ❤️ 1
    尽管我很反对 GraphQL,但这种需求,就是 GraphQL 的菜。
    ZiLong
        37
    ZiLong  
       283 天前
    你是不是想要 jhipster 或者
    jeecg-boot 这种?
    WEBUG
        38
    WEBUG  
    OP
       283 天前
    @xuanbg #36 有点这个感觉了,我研究研究
    hantsy
        39
    hantsy  
       282 天前
    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  
       282 天前
    动态生成 entity 和 dao 层的.java 文件, 并自动提交到 git 仓库, 触发构建部署就行了
    liian2019
        41
    liian2019  
       277 天前
    1. 获取数据库表结构,做成配置保存
    2. 从配置表读取配置,利用 javassist/asm 生成 pojo,mapper 等等类的 class 加载到虚拟机
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4164 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    ♥ Do have faith in what you're doing.