【问题标题】:One-to-One association with composite ID of owner Entity与所有者实体的复合 ID 一对一关联
【发布时间】:2016-05-26 07:24:58
【问题描述】:

我必须在两个实体之间建立一对一的关联,但其中一个实体必须有两个@Id。一个是PRI,另一个是MUL。我必须如何声明复合 ID,以及如何映射类?

@Entity
@Table(name = "PERSONS")
public class Person implements Serializable{
    private static final long serialVersionUID = -3451407520028311143L;
    @Id
    @Column(name = "ID")
    private Integer id;

    @Column(name = "ADDRESS_ID")
    private Integer addressId;

    @Column(name ="NAME")
    private String name;

    @OneToOne(mappedBy= "person", cascade= CascadeType.ALL)
    private Address address;
     ...
}

第二类通过@IdClass注解映射

@Entity
@Table ( name = "ADDRESS" )
@IdClass(AddressKeys.class)
public class Address implements Serializable {


    @Id
    @Column ( name = "ID")
    private Integer id;

    @Id
    @Column ( name = "PERSON_ID")
    private Integer idPerson;

    @Column ( name = "CITY" )
    private String city;

    @OneToOne(cascade= CascadeType.ALL)
    @JoinColumn(name="PERSON_ID")
    private Person person;
...
}

和 id 类

class AddressKeys implements Serializable{
    private Integer id;
    private Integer idPerson;

    //getters and setters

    @Override
    public int hashCode() {
        ...
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        ...
    }

}

所以当我尝试创建和保存记录时,我遇到了下一个错误

无法在实体映射中打开 sessionRepeated 列: hibernateMappedModels.base1.mappedClasses.oneToOne.Address 列: PERSON_ID(应该用 insert="false" update="false" 映射) java.lang.NullPointerException 在 hibernateMappedModels.base1.Main.run(Main.java:45) 在 hibernateMappedModels.base1.Main.main(Main.java:24

我尝试使 Id 字段不可插入和不可更新,它正在工作,但我需要它们是可插入和可更新的;有没有可能做到这一点?

【问题讨论】:

    标签: java hibernate jpa annotations


    【解决方案1】:

    我对您的映射感到困惑,并且不确定除了下面的简单映射之外还需要什么:如果我遗漏了某些内容,那么您将需要扩展您的问题。您在两次映射列时收到错误 - 一次通过一对一映射,一次作为简单属性。此外,我不确定为什么您需要地址上的复合键。

    @Entity
    @Table(name = "PERSONS")
    public class Person implements Serializable{
        private static final long serialVersionUID = -3451407520028311143L;
    
        @Id
        @Column(name = "ID")
        private Integer id;
    
        @Column(name ="NAME")
        private String name;
    
        @OneToOne(mappedBy= "person", cascade= CascadeType.ALL)
        private Address address;
    
    }
    
    @Entity
    @Table ( name = "ADDRESS" )
    public class Address implements Serializable {
    
    
        @Id
        @Column ( name = "ID")
        private Integer id;
    
        @Column ( name = "CITY" )
        private String city;
    
        @OneToOne(cascade= CascadeType.ALL)
        @JoinColumn(name="PERSON_ID")
        private Person person;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多