![](/img/trans.png)
[英]Alternative to save in JPA/Hibernate with non autogenerated 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.