如何在JPA/JAVA/Hibernate中的两列中插入自动生成的ID

如何在JPA/JAVA/Hibernate中的两列中插入自动生成的ID,java,jpa,Java,Jpa,我在DAO类的JPA java中使用autogenerator生成id。 由于愚蠢的数据库体系结构,我需要生成主键并将相同的id插入同一表的两列中 @Id @GeneratedValue(generator = DataConstants.ABC) @Column(name = "SYS_ID") private Long Sysid; @Column(name = "SYS_NUM") private Long sysNum; 现在我有了上面提到的DAO类,它可以正常工作,并在SYS_ID

我在DAO类的JPA java中使用autogenerator生成id。 由于愚蠢的数据库体系结构,我需要生成主键并将相同的id插入同一表的两列中

@Id
@GeneratedValue(generator = DataConstants.ABC)
@Column(name = "SYS_ID")
private Long Sysid;

@Column(name = "SYS_NUM")
private Long sysNum;
现在我有了上面提到的DAO类,它可以正常工作,并在SYS_ID列中插入自动生成的主键

解决这一问题的一种方法是插入数据并获取sysid,然后在其上运行Update,而Update不支持这一点;对我来说似乎不可行


任何帮助都将不胜感激

我最近遇到了一个类似的问题,并最终提出了以下解决方案:我使用hibernate、panache、lombok来描述我的实体:

Master.java

@Entity
@AllArgsConstructor
@NoArgsConstructor
@RegisterForReflection
@Table(name = "MASTER")
@FieldDefaults(level = AccessLevel.PUBLIC)
public class Master extends PanacheEntityBase {
    @Id
    @Column(name = "MASTERID", nullable = false)
    Long masterId;

    @Column(name = "DETAILID", nullable = false)
    Long detailId;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "master", cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    Set<Detail> details = new HashSet<>(0);

    @Column(name = "DATECREATED", nullable = false)
    Date dateCreated;

    public static Master createMasterWithLoadId() {
        Query nativeQuery = Panache.getEntityManager().createNativeQuery("select MASTER_SEQ.nextval from dual");
        Master master = new Master();
        master.masterId = id;
        master.detailId = id;
        return master;
    }

     @PrePersist
     public void prePersist() {
        if (dateCreated == null) {
           dateCreated = clearTime(Calendar.getInstance()).getTime();
        }
     }

     private Calendar clearTime(Calendar cal) {
         cal.set(Calendar.HOUR_OF_DAY, 0);
         cal.set(Calendar.MINUTE, 0);
         cal.set(Calendar.SECOND, 0);
         cal.set(Calendar.MILLISECOND, 0);
         return cal;
     }
}
使用:


为什么看起来不可行?你试过了吗?你试过的密码在哪里?你期望会发生什么,而实际上发生了什么?从某种意义上说,我必须创建两个DB调用。我们有数以百万计的用户,所以我试图找出解决方案,在一个DB callNo中完成工作。这取决于你的发电机做什么。如果是基于序列或表的,则持久化实体实际上不会在数据库中插入行。但是它会给它的ID分配一个值。通过测试和观察发生了什么来检查你的假设。
@Entity
@NoArgsConstructor
@AllArgsConstructor
@RegisterForReflection
@IdClass(BatchContent.ContentId.class)
@Table(name = "DETAIL")
@FieldDefaults(level = AccessLevel.PUBLIC)
public class Detail extends PanacheEntityBase {
    @Id
    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "detailId", nullable = false)
    Master master;

    @Id
    @Column(name = "one")
    Long one;

    @Id
    @Column(name = "two")
    Long two;

    @Getter
    @Setter
    @EqualsAndHashCode
    @NoArgsConstructor
    @AllArgsConstructor
    @RegisterForReflection
    @FieldDefaults(level = AccessLevel.PRIVATE)
    static class DetailId implements Serializable {

        Master master;

        Long one;

        Long two;

    }
}
Master master = Master.createMasterWithLoadId();
for (RequestDetail rDet : rDetails) {
    master.details.add(new Detail(master, rDet.getOne(), rDet.getTwo()));
}
master.persist();