Hibernate не в состоянии ПОЛУЧИТЬ права ребенка - PullRequest
0 голосов
/ 08 марта 2019

У меня есть две сущности, а именно Студент и Адрес.Родительской сущностью является Студент, а дочерней сущностью является Адрес.Учитывая, что у каждого учащегося может быть только один адрес, и каждый адрес может принадлежать только одному ученику, а объявление ссылки на адрес только в ученике делает его однонаправленным сопоставлением один-к-одному.

Данные как ученика, так и адресасохраняется через REST API (POST Mapping) отдельно.Здесь родительская сущность Student сохраняется отдельно, а дочерняя сущность также сохраняется отдельно через 2 разные конечные точки.

Но, выполняя операцию GET для Student, я хотел бы включить Адрес, принадлежащий 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>

Address 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>

Я хотел бы знать, что нужно сделать, чтобы я мог включить Address при получении Student с помощью конечной точки GET.

1 Ответ

0 голосов
/ 08 марта 2019

Вам необходимо объявить соотношение 1: 1 в обеих сущностях. В противном случае при сохранении адреса, прикрепленного к идентификатору студента, 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

...