Hibernate 如何通过使用JPA注释为复合键创建复合ID类来插入和更新表3
有三个表HouseEntity、HousePersonEntity和PersonEntity HouseEntity由houseNumber和houseName的唯一组合标识。 此实体没有主键,它将houseNumber和houseName作为复合键 PersonEntity具有id(自动生成)和名称 HousePersonEntity是一个逻辑表,用于存储具有多个人id的一个房屋。因此,简而言之,HouseEntity与PersonEntity具有一对多关系 JPA实体Hibernate 如何通过使用JPA注释为复合键创建复合ID类来插入和更新表3,hibernate,jpa,spring-data-jpa,jpa-2.0,jpa-2.1,Hibernate,Jpa,Spring Data Jpa,Jpa 2.0,Jpa 2.1,有三个表HouseEntity、HousePersonEntity和PersonEntity HouseEntity由houseNumber和houseName的唯一组合标识。 此实体没有主键,它将houseNumber和houseName作为复合键 PersonEntity具有id(自动生成)和名称 HousePersonEntity是一个逻辑表,用于存储具有多个人id的一个房屋。因此,简而言之,HouseEntity与PersonEntity具有一对多关系 JPA实体 @Entity @Ta
@Entity
@Table(name="House")
public class HouseEntity extends AbstractObject implements Serializable {
@EmbeddedId
private HouseEntityPK pk; //Composit key
//bi-directional many-to-one association to Dependent
@OneToMany(mappedBy="primaryKey.houseEntity ", cascade=CascadeType.ALL)
private Set<HousePersonEntity > housePersonEntity = new HashSet<HousePersonEntity>();
@Embeddable
public class HouseEntityPK implements Serializable {
@Column(name = "H_HOUSENUMBER", unique = true, nullable = false)
private int houseNumber;
@Column(name = "H_HOUSENAME", unique = true, nullable = false)
private String houseName;
@Entity
@Table(name="Person")
public class PersonEntity{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "PERSON_SEQ")
@Column(name = "ID", unique = true, nullable = false)
private int id;
private String name;
@Entity
@Table(name="HouseHavingPersons")
@AssociationOverrides({
@AssociationOverride(name = "primaryKey.personEntity",joinColumns = @JoinColumn(name = "ID")),
@AssociationOverride(name = "primaryKey.houseEntity", joinColumns = {
@JoinColumn(name = "H_HOUSENUMBER" , referencedColumnName = "H_HOUSENUMBER") ,
@JoinColumn(name = "H_HOUSENAME" , referencedColumnName = "H_HOUSENAME") })
})
public class HousePersonEntity extends AbstractObject implements Serializable {
@EmbeddedId
private HousePersonEntityPK pKey= new HousePersonEntityPK();
@Transient
public PersonEntity getPersonEntity() {
return getPrimaryKey().getPersonEntity();
}
@Transient
public HouseEntity getHouseEntity() {
return getPrimaryKey().getHouseEntity();
}
@Embeddable
public class HousePersonEntityPK implements Serializable {
@ManyToOne(cascade=CascadeType.ALL)
private HouseEntity houseEntity ;
@ManyToOne(cascade=CascadeType.ALL)
private PersonEntity personEntity ;
@实体
@表(name=“House”)
公共类HouseEntity扩展AbstractObject实现可序列化{
@嵌入ID
private HouseEntityPK;//复合密钥
//双向多对一关联到依赖
@OneToMany(mappedBy=“primaryKey.houseEntity”,cascade=CascadeType.ALL)
private Set housePersonEntity=new HashSet();
@可嵌入
公共类HouseEntityPK实现可序列化{
@列(name=“H_HOUSENUMBER”,unique=true,nullable=false)
私人住宅号码;
@列(name=“H_HOUSENAME”,unique=true,nullable=false)
私有字符串名称;
@实体
@表(name=“Person”)
公共阶级人格{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“PERSON_SEQ”)
@列(name=“ID”,unique=true,nullable=false)
私有int-id;
私有字符串名称;
@实体
@表(name=“HouseHavingPersons”)
@联想超越({
@AssociationOverride(name=“primaryKey.personEntity”,joinColumns=@JoinColumn(name=“ID”),
@AssociationOverride(name=“primaryKey.houseEntity”,joinColumns={
@JoinColumn(name=“H_HOUSENUMBER”,referencedColumnName=“H_HOUSENUMBER”),
@JoinColumn(name=“H\u HOUSENAME”,referencedColumnName=“H\u HOUSENAME”)})
})
公共类HousePersonEntity扩展了AbstractObject实现可序列化{
@嵌入ID
private housepersonentitypkey=新HousePersonEntityPK();
@短暂的
公共人格getPersonEntity(){
返回getPrimaryKey().getPersonEntity();
}
@短暂的
public HouseEntity getHouseEntity(){
返回getPrimaryKey().getHouseEntity();
}
@可嵌入
公共类HousePersonEntityPK实现可序列化的{
@多通(级联=级联类型.ALL)
私人住宅实体;
@多通(级联=级联类型.ALL)
私人人格人格;
在HouseHavingPersons
中,当我插入数据时,它首先在House
中插入数据,然后在HouseHavingPersons
表中插入与该房屋相关联的所有人名,表中包含房屋和人员的所有详细信息。这很好。对于所有新的关联,它首先在House中插入,然后在中填充HouseHavingPersons
当我尝试更新任何记录时,问题就开始了,例如如果表House
中已经存在houseNumber,并且只有很少的列被更新,并且添加或更新了新的人员,那么它就不起作用。它只更新House
表,并且在HouseHavingPersons
中没有条目。我做错了什么?有什么问题吗对于这种情况,还有其他方法吗?如果有任何帮助,我们将不胜感激
编辑..以获取更多解释
嗨,尼古拉斯,我有一个链接有类似的例子,这是供你参考。 --请参见为复合键创建复合ID类 在这里,我的问题是更新不是插入。更新时,我能够更新House表,但HousePersonEntity上没有更新,并进行无限循环 要测试的场景包括 1.如果没有房屋id的数据,则插入房屋,然后插入相关人员id以及人员id、医院id、姓名
所以一个房子可以有多个人,这种关联应该存在于HousePersonEntity表中。你不太清楚你的问题是什么。你说你在
房子
中添加了一个人
,而没有任何条目是房子拥有人
。这是因为房子
不拥有这种关系
@OneToMany(mappedBy="primaryKey.houseEntity ", cascade=CascadeType.ALL)
private Set<HousePersonEntity > housePersonEntity = new HashSet<HousePersonEntity>();
@OneToMany(mappedBy=“primaryKey.houseEntity”,cascade=CascadeType.ALL)
private Set housePersonEntity=new HashSet();
这里的
mappedBy
表示HouseHavingPersons
(HousehavingPersonentity
)拥有关系。这意味着您必须为房屋
插入新的人员
,并将其保存到该实体中。添加这些人员不会做任何事情,因为房屋实体
不拥有关系。您需要了解这一点。房屋人员
字段is仅用于查询和结果,而不用于插入和更新。嗨,Nicholas,我有一个链接有类似的示例,这是关于您的参考。--请参阅为复合键创建复合ID类。更新情况也应如此。正如我在上面的示例中提到的所有场景