Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何通过使用JPA注释为复合键创建复合ID类来插入和更新表3_Hibernate_Jpa_Spring Data Jpa_Jpa 2.0_Jpa 2.1 - Fatal编程技术网

Hibernate 如何通过使用JPA注释为复合键创建复合ID类来插入和更新表3

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

有三个表HouseEntity、HousePersonEntity和PersonEntity

HouseEntity由houseNumber和houseName的唯一组合标识。 此实体没有主键,它将houseNumber和houseName作为复合键

PersonEntity具有id(自动生成)和名称

HousePersonEntity是一个逻辑表,用于存储具有多个人id的一个房屋。因此,简而言之,HouseEntity与PersonEntity具有一对多关系

JPA实体

@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、姓名

  • 如果已经存在house id条目,则在house PersonEntity中插入更新的人员条目

  • 如果条目已存在于House表中,但需要更新的房屋柱数很少,则更新该房屋id的房屋表,然后插入House Personentity。如果条目存在,则更新现有字段,并在House Personentity中插入新数据记录


  • 所以一个房子可以有多个人,这种关联应该存在于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类。更新情况也应如此。正如我在上面的示例中提到的所有场景