尝试级联持久子实体时出现 PersistenceException
PersistenceException while trying to cascade persist child entity
我有 2 个实体:
大师:
@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "seq")
private Integer seq;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "seq", referencedColumnName = "seq")
private SubMaster subMaster;
...................
}
子大师:
@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {
@Id
@Column(name = "seq")
private Integer seq;
private String subName;
...................
}
当我尝试通过设置 SubMaster
实体来保留 Master
实体时,出现以下异常:
javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned beforeQuery calling save(): SubMaster
然而,我希望 Hibernate 在持久化父实体时自动持久化子实体。
也为 SubMaster 添加 @GeneratedValue(strategy = IDENTITY),似乎是 SubMaster 的 id 产生了异常
首先你颠倒了关联的所有者,因为我认为 subMaster 应该有 @JoinColumn 注释。
现在寻找解决方案
取决于 JPA 版本:
-2.0 你可以在关系注释上定义 @Id
注释这样你就可以有类似
@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "seq")
private Integer seq;
@OneToOne(mappedBy = "master", cascade = CascadeType.ALL)
private SubMaster subMaster;
}
@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {
@Id
@JoinColumn(name = "seq", referencedColumnName = "seq")
@OneToOne
private Master master;
private String subName;
}
你在哪里告诉你的子实体使用父实体的 id
master.setSubMaster(subMaster);
subMaster.setMaster(master)
-1.0 你几乎被困住了,因为你被迫将 @Id
放在基本注释上,所以你需要将 id 和关系列分开,问题是 @GeneratedValue
您被迫先保存父项,然后在保存之前手动将 id 设置为子项
我有 2 个实体:
大师:
@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "seq")
private Integer seq;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "seq", referencedColumnName = "seq")
private SubMaster subMaster;
...................
}
子大师:
@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {
@Id
@Column(name = "seq")
private Integer seq;
private String subName;
...................
}
当我尝试通过设置 SubMaster
实体来保留 Master
实体时,出现以下异常:
javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned beforeQuery calling save(): SubMaster
然而,我希望 Hibernate 在持久化父实体时自动持久化子实体。
也为 SubMaster 添加 @GeneratedValue(strategy = IDENTITY),似乎是 SubMaster 的 id 产生了异常
首先你颠倒了关联的所有者,因为我认为 subMaster 应该有 @JoinColumn 注释。
现在寻找解决方案
取决于 JPA 版本:
-2.0 你可以在关系注释上定义 @Id
注释这样你就可以有类似
@Entity
@Table(name = "master")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "seq")
private Integer seq;
@OneToOne(mappedBy = "master", cascade = CascadeType.ALL)
private SubMaster subMaster;
}
@Entity
@Table(name = "sub_master")
public class SubMaster implements java.io.Serializable {
@Id
@JoinColumn(name = "seq", referencedColumnName = "seq")
@OneToOne
private Master master;
private String subName;
}
你在哪里告诉你的子实体使用父实体的 id
master.setSubMaster(subMaster);
subMaster.setMaster(master)
-1.0 你几乎被困住了,因为你被迫将 @Id
放在基本注释上,所以你需要将 id 和关系列分开,问题是 @GeneratedValue
您被迫先保存父项,然后在保存之前手动将 id 设置为子项