注释中mappedBy属性的含义?

n_g*_*n_g 6 hibernate jpa

我是hibernate的新手.我试图在以下代码中创建Person和PersonDetail实体之间的一对一映射:

@Entity
public class Person {

    private int personId;
    private String personName;
    private PersonDetail personDetail;

    @OneToOne(mappedBy="person")
    public PersonDetail getPersonDetail() {
        return personDetail;
    }

    public void setPersonDetail(PersonDetail personDetail) {
        this.personDetail = personDetail;
    }

    @Id
    @GeneratedValue
    public int getPersonId() {
        return personId;
    }

    public void setPersonId(int personId) {
        this.personId = personId;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }
}


@Entity
public class PersonDetail {

    private int personDetailId;
    private String zipCode;
    private String job;
    private double income;

    private Person person;

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Id
    @GeneratedValue
    public int getPersonDetailId() {
        return personDetailId;
    }

    public void setPersonDetailId(int personDetailId) {
        this.personDetailId = personDetailId;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public double getIncome() {
        return income;
    }

    public void setIncome(double income) {
        this.income = income;
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望PersonDetail应该是拥有实体(我知道反之亦然,但我只是想测试).我不明白的是使用了我放在Person实体中的mappedBy属性.如果我删除它,我会收到以下错误:"无法确定类型:com.hibernate.onetoonemapping.PersonDetail,在表:Person,for columns:[org.hibernate.mapping.Column(personDetail)]"

这个mappedBy属性有什么作用?我已经读过mappedBy属性放在非拥有方.但究竟是什么呢?

Xor*_*rty 9

这意味着entites之间的关系已经被映射,所以你不要这样做两次.你只需使用mappedBy属性说"嘿它在那里完成".


Jef*_*eff 8

当您想要mappedBy在非拥有方面进行双向关系(可从实体的任何一方访问)时,因为您只能定义一次关系.

mappedBy告诉Hibernate如何创建实体的实例并将数据加载到实体中.它应该引用要注释的类中的字段名称,PersonDetail在本例中,定义关系.