簡體   English   中英

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

[英]How to insert autogenerated ID in two columns in JPA/JAVA/Hibernate

我在 DAO 類的 JPA java 中使用自動生成器生成 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,然后對其運行更新,這對我來說似乎不可行。

任何幫助,將不勝感激

我最近遇到了類似的問題,並最終提出了以下解決方案:我使用 hibernate、panache、lombok 來描述我的實體:

大師.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;
     }
}

細節.java

@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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM