有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate:在两个属性中生成相同的值

我希望生成第一个:

@Id
@Column(name = "PRODUCT_ID", unique = true, nullable = false, precision = 12, 
        scale = 0)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PROD_GEN")
@BusinessKey
public Long getAId() {
    return this.aId;
}

我希望最初的出价与援助完全一样。一种方法是插入实体,然后获取DB生成的aId(第二次查询),然后更新实体,将bId设置为等于aId(第三次查询)。有没有办法让投标获得与援助相同的产生价值

请注意,之后,我希望能够从gui更新bId

如果解决方案是JPA,那就更好了


共 (2) 个答案

  1. # 1 楼答案

    选择你的毒药:

    选项#1

    您可以将bId注释为org.hibernate.annotations.Generated,并在插入时使用数据库触发器(我假设nextval已经分配给AID,因此我们将分配curval进行BID):

    CREATE OR REPLACE TRIGGER  "MY_TRIGGER"
      before insert on "MYENTITY"
      for each row 
    begin  
      select "MYENTITY_SEQ".curval into :NEW.BID from dual;
    end; 
    

    我不太喜欢触发器和幕后发生的事情,但这似乎是最简单的选择(但不是便携性的最佳选择)

    选项2

    创建一个新实体,保存它,刷新实体管理器以获得分配的id,在bId上设置aId,合并实体

    em.getTransaction().begin();
    MyEntity e = new MyEntity();
    ...
    em.persist(e);
    em.flush();
    e.setBId(e.getAId());
    em.merge(e);
    ...
    em.getTransaction().commit();
    

    很难看,但很管用

    选项3

    使用回调注释设置内存中的bId(直到写入数据库):

    @PostPersist
    @PostLoad
    public void initialiazeBId() {
        if (this.bId == null) {
            this.bId = aId;
        }
    }
    

    如果您不需要在insert上写入id,那么这应该是可行的(但在这种情况下,请参见选项4)

    选项4

    实际上,您可以在bId的getter中添加一些逻辑,而不是使用回调:

    public Long getBId() {
        if (this.bId == null) {
            return this.aId;
        }
        return this.bId;
    }
    

    同样,如果您不需要在插入时将id持久化到数据库中,这将起作用

  2. # 2 楼答案

    如果您使用JPA,在插入新的A之后,id应该设置为生成的值,i tough(可能取决于您使用的JPA提供者),因此不需要第二次查询。然后在DAO中将bld设置为ald值