gpt4 book ai didi

hibernate - 具有复合主键的一对一双向映射

转载 作者:行者123 更新时间:2023-12-03 16:13:56 24 4
gpt4 key购买 nike

有人可以帮助我使用 Hibernate/JPA 使用复合主键为以下关系进行双向一对一 JPA 映射吗?
enter image description here

最佳答案

您可以使用 @Embeddable映射两个实体的复合主键和一个 @MapsId您的 User 地址属性上的注释实体共享主键。

但在我向您展示映射之前,请注意 User是大多数数据库中的保留字。我建议您为实体选择一个不同的名称。在我的示例中,我将其更改为 Person .

让我们从 @Embeddable 开始映射主键。我为类(class)命名 AddressKey .这是一个简单的 Java 类,它实现了 Serializable界面并具有属性 xIdyId .您还需要实现 equalshashCode方法。

@Embeddable
public class AddressKey implements Serializable {

private Long xId;
private Long yId;

public AddressKey() {}

public AddressKey(Long xId, Long yId) {
this.xId = xId;
this.yId = yId;
}

// omit getter and setter for readability

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((xId == null) ? 0 : xId.hashCode());
result = prime * result + ((yId == null) ? 0 : yId.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AddressKey other = (AddressKey) obj;
if (xId == null) {
if (other.xId != null)
return false;
} else if (!xId.equals(other.xId))
return false;
if (yId == null) {
if (other.yId != null)
return false;
} else if (!yId.equals(other.yId))
return false;
return true;
}
}

如果您使用 @EmbeddedId 注释该属性,您可以使用 AddressKey可嵌入以映射 Address 的主键类(class)。
@Entity
public class Address {

@EmbeddedId
private AddressKey id;

private String city;

private String street;

private String country;

@OneToOne(mappedBy = "address")
private Person person;

// omit getter and setter methods
}
Person的映射实体看起来很相似。除了主键映射,还需要注释 address属性,将关联映射到 Person实体,与 @MapsId .这告诉 Hibernate 它应该使用关联 Address 的主键。实体作为 Person 的主要实体实体。

您还需要注释 address属性为 2 @JoinColumn将外键映射到 xId 的注释和 yId Person 表的列。如果没有这些注释,Hibernate 会将它们映射到列 address_xIdaddress_yId .
@Entity
public class Person {

@EmbeddedId
private AddressKey id;

private String name;

private String society;

@OneToOne
@JoinColumn(name="xId", referencedColumnName="xId")
@JoinColumn(name="yId", referencedColumnName="yId")
@MapsId
private Address address;

// omit getter and setter methods for readability
}

关于hibernate - 具有复合主键的一对一双向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54366392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com