[英]How Hibernate match entity in one-to-one relation, despite of absence of a foreign Key?
我还在学习休眠 ORM。 我创建了 2 个实体:student 和 address。它们之间的关系是一对一的双向关系。但是当我检查数据库时,我发现了 3 个表:Student、Address 和 hibernate_sequence(其中注册了一个名为 next_val 的 int 属性)。
这些是表结构: student
( STUDENT_ID
, FIRST_NAME
, LAST_NAME
, SECTION
) address
( ADDRESS_ID
, CITY
, COUNTRY
, STREET
) hibernate_sequence
( next_val
)
尽管没有外键,我想知道 hibernate 如何将学生与其地址匹配。 顺便说一下,我试过 session.find(Student.class, student3.getId()) 并且我得到了那个学生的地址。
这是我的学生课:
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "STUDENT")
public class Student {
@Id
@GeneratedValue
@Column(name = "STUDENT_ID")
private long id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@OneToOne(mappedBy="student", cascade = CascadeType.ALL)
private Address address;
public Student() {
}
public Student(String firstName, String lastName, String section) {
this.firstName = firstName;
this.lastName = lastName;
this.section = section;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName="
+ lastName + ", section=" + section + ", address=" + address
+ "]";
}
}
这是我的地址代码:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name="ADDRESS_ID")
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign",parameters=@Parameter(name="property", value="student"))
private long id;
@Column(name = "STREET")
private String street;
@Column(name = "CITY")
private String city;
@Column(name = "COUNTRY")
private String country;
@OneToOne
@PrimaryKeyJoinColumn
private Student student;
public Address() {
}
public Address(String street, String city, String country) {
this.street = street;
this.city = city;
this.country = country;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Address [id=" + id + ", street=" + street + ", city=" + city
+ ", country=" + country + "]";
}
}
由于它是 1 对 1 的关系,因此它使用表student
的键值作为表address
的 id 。 如果您在trace
级别启用日志记录并(在省略大量消息后)检查发送到数据库的参数化查询以及这些参数的值,您可能会看到这些详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.