我有两个实体,即学生和地址。父实体是学生,子实体是地址。考虑到每个学生只能有一个地址,而每个地址只能属于一个学生,因此仅在Student中声明地址引用,便使其成为单向一对一映射。
Student和Address数据分别通过REST API(POST映射)保留。在这里,父实体Student是分别保留的,子实体也是通过2个不同的端点分别保留的。
但是在对Student执行GET操作时,我想将属于该Student的地址包括在暴露给使用者的资源中。
public class Student{
private String studentId; //pk
private String firstName;
private String lastName;
private Address address;
//getters and setters
}
public class Address{
private String addressId; //pk
private String streetAddress;
private String addressLine1;
private String addressLine2;
private String city;
private String state;
private String country;
private String zipCode;
//getters and setters
}
学生桌
CREATE TABLE STUDENT (
STDNT_ID VARCHAR(20) PRIMARY KEY,
FIRST_NAME VARCHAR(30) NOT NULL,
LAST_NAME VARCHAR(30) NOT NULL
);
地址表
CREATE TABLE ADDRESS (
A_ID VARCHAR(20) PRIMARY KEY,
STREET_ADDRESS VARCHAR(20),
ADDR1 VARCHAR(20) NOT NULL,
ADDR2 VARCHAR(20) NOT NULL,
CITY VARCHAR(20)NOT NULL,
STATE VARCHAR(20)NOT NULL,
COUNTRY VARCHAR(20) NOT NULL,
ZIPCODE INTEGER(5)NOT NULL,
STDNT_ID VARCHAR(20) UNIQUE,
FOREIGN KEY(STDNT_ID) REFERENCES STUDENT(STDNT_ID)
);
学生hbm.xml
<hibernate-mapping>
<class name="Student" table="STDT">
<id name="studentId" column="ID"</id>
<property name="name" column="NAME" update="false" type="string" />
<property name="firstName" column="FIRST_NAME"/>
<property name="lastName" column="LAST_NAME"/>
<one-to-one name="address" lazy="false" fetch="join" class="com.orgname.projectname.Address"></one-to-one>
</class>
<hibernate-mapping>
地址hbm.xml
<hibernate-mapping>
<class name="Address" table="ADDRESS">
<id name="addressId" column="A_ID"</id>
<property name="streetAddress" column="STREET_ADDRESS"/>
<property name="addressLine1" column="ADDR1"/>
<property name="addressLine2" column="ADDR2"/>
<property name="city" column="CITY"/>
<property name="state" column="STATE"/>
<property name="country" column="COUNTRY"/>
<property name="zipCode" column="ZIPCODE"/>
<property name="student_id" column="STDNT_ID"/>
</class>
<hibernate-mapping>
我想知道需要做些什么,以便在通过GET端点检索Student时包括地址。
答案 0 :(得分:0)
您需要在两个实体中声明1:1关系。否则,当您保存附加到学生ID的地址时,hibernate会将其视为“ STDNT_ID”列中的值,而不是外键。因此,这两个实体之间没有建立关系。
<class name="Address" table="ADDRESS">
...
<one-to-one name="student" constrained="true" class="Student" />
</class>
在您的实体中:
public class Address{
...
private Student student;
}
您可以在此处找到类似的示例:https://www.codejava.net/frameworks/hibernate/hibernate-one-to-one-with-primary-key-xml-mapping-example