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

Hibernate entity association, persiste 玩不明白

  •  1
     
  •   bleulucaswu · 2023-10-26 22:14:56 +08:00 · 1012 次点击
    这是一个创建于 423 天前的主题,其中的信息可能已经有所发展或是发生改变。
    @Entity
    public class AccountEntity{
    
        @ManyToOne(fetch = FetchType.EAGER, optional = false)
        @Cascade(CascadeType.ALL)
        @JoinColumn(name = COLUMN_TYPEID_NAME, referencedColumnName = CardTypeEntity.COLUMN_ID_NAME, unique = true)
        private CardTypeEntity cardTypeEntity;
    }
    
    @Entity
    public class CardTypeEntity { 
        @Column(name = COLUMN_TYPENAME_NAME, nullable = false)
        @NotNull
        @NotBlank
        private String typeName;
    }
    
    • 也就是一个纯单向的关联
    • account 数据库有个 column type_id 关联到 card_type 表的 pk id
      • 但是在 java 代码里不需要写这个字段
      • card_type 表有一个不为空的 unique 的type_name column
    • 如果用 spring CrudRepository 的 save 方法, repositoryClass.save(accountEntity)
      • 一个 new account 关联的 cardType name 表里可能不存在,那么 save 没问题,
        • hibernate insert 一个 new cardType row, 然后 insert new account 且 new cardType id 放到 account type_id 字段里
      • 但是如果 cardType 表里已存在,那就异常了, 这该咋办啊
    • 如果注入 entityManager, 用 em.persist 也是一样的

    我想做一个每次插入一个新纪录,如果关联的 type 有那就只插入 account 且把 type_id 关联到表里,如果没有两张表都新建,该怎么写代码???

    3 条回复    2023-10-27 10:32:00 +08:00
    chuck1in
        1
    chuck1in  
       2023-10-27 09:28:15 +08:00
    hibernate 在使用上心智负担是比较大的,除了映射关系的抽象比较复杂以外,还要理解诸如实体的生命周期,持久化上下文,实体对象与值对象的区分等才能比较好的使用它。
    我之前也用了蛮久的 hibernate ,后来换项目很多概念也忘了。建议 op 换个框架试试?现在项目在用 jooq 还挺满意的。
    Jrue0011
        2
    Jrue0011  
       2023-10-27 10:19:21 +08:00
    没用过 Hibernate ,理论上他这种框架既然有自动处理,那应该也会通过某种方式判断存在不存在吧?

    比如有没有可能类似加一个注解(看文档里好像有个注解是 NaturalId )标识你这个 type_name 上有唯一索引,以及你的 JoinColumn 注解也加上这个 type_name (同样看文档里有个注解是 JoinColumns ,另外字段上也能加多个 JoinColumn ),然后 Hibernate 就会在创建前先查询下?
    Leo666666
        3
    Leo666666  
       2023-10-27 10:32:00 +08:00
    你可以把 CardType 主键改成 typeName ,或者是在 Account 中设置 CardType 之前先查询对应的 cardType 是否存在
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:12 · PVG 00:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.