2013-07-23 1 views
0

у меня есть две родительских таблиц и одну таблицы ребенка, с нижеперечисленным композитом ключа:Hibernate One To One картирования, с одним ребенком и два родительских таблицами

Employee: 
     employeeId1 (PK) 
     employeeId2 (PK) 
     employeeName 
     ---some other columns go here---- 


Student: 
     studentId1 (PK) 
     studentId2 (PK) 
     studentName 
     ---some other columns go here---- 

Address: 
     addressId (PK) 
     addressPersonId1 (PK & FK) 
     addressPersonId2 (PK & FK) 
     ---some other columns go here---- 

сотрудников и студенты могут иметь тот же адрес, так Employee и Студент может ссылаться на ту же запись в адресе.

Это не реально таблицу, у меня есть в моем приложении, но структура остается тем же, Я не могу изменить структуру таблицы любой ценой.

Я хочу достичь отношений «один к одному» между (Employee, Address) и (Student, Address). Поскольку количество столбцов PK и имен столбцов PK не одинаково, я не могу создать отношения.

Каков подход для указания столбцов в адресе (addressPersonId1, addressPersonId2) в качестве основного и Forign-ключа. И как я могу обращаться к этим видовым клавишам из файлов родительского hbm.

**I have to establish mapping using HBM files but not hibernate or JPA annotations.** 


**Is there any way to specify forign key column names in One to One tag in hbm file.** 

Заранее благодарим за любые предложения и решения.

Employee.hbm.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.model.Employee" table="EMPLOYEE"> 
     <composite-id name="employeePK" class="com.model.EmployeePK"> 
      <key-property name="employeeId" column="EMPLOYEE_ID" /> 
      <key-property name="employeeName" column="EMPLOYEE_NAME" /> 
     </composite-id> 

     <property name="employeeStatus" type="string"> 
      <column name="EMPLOYEE_STATUS" /> 
     </property> 

     <one-to-one name="address" class="com.model.Address" 
      cascade="all"> 
     </one-to-one> 

    </class> 
</hibernate-mapping> 


Student.hbm.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.model.Student" table="STUDENT"> 
     <composite-id name="studentPK" class="com.model.StudentPK"> 
      <key-property name="studentId" column="STUDENT_ID" /> 
      <key-property name="studentName" column="STUDENT_NAME" /> 
     </composite-id> 

     <property name="studentStatus" type="string"> 
      <column name="STUDENT_STATUS" /> 
     </property> 
    </class> 
</hibernate-mapping> 



Address.hbm.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.model.Address" table="ADDRESS"> 
     <composite-id name="addressPK" class="com.model.AddressPK"> 
      <key-property name="addressId" column="ADDRESS_ID" /> 
      <key-property name="addressPersonId" column="ADDRESS_PERSON_ID" /> 
      <key-property name="addressPersonName" column="ADDRESS_PERSON_NAME" /> 
     </composite-id> 

     <property name="addressStatus" type="string"> 
      <column name="ADDRESS_STATUS" /> 
     </property> 
    </class> 
</hibernate-mapping> 
+0

В случае один ко многим, можно указать имена отображение столбцов в родительский HBM файл, как ** <имя столбца = «column1» не-NULL = «истинный» /> имя <столбец = «COLUMN2» not-null = "true" /> ** Можно ли указать это в отношениях один к одному. –

+0

' <имя-join name =" ADDRESS_ID "/> ' '' имя_соединения = = ADDRESS_ID "/>' является вашим внешний ключ в другой таблице – Angga

+0

Позвольте мне попробовать ... –

ответ

0

попробуйте добавить ключ, прежде чем ваш один-к-одному

<one-to-one name="address" class="com.model.Address" cascade="all"></one-to-one> 

стали:

<key> 
    <column name="addressPK.studentCompositeId<!--<<im not sure about this, maybe you can try studentCompositeId-->" not-null="true" /> 
</key> 
<one-to-one name="address" class="com.model.Address" cascade="all"/> 

и дать изменения составной ключ 2 Послания к стали 1 композит (потребуется для редактирования класса тоже), так что внутри com.model.AddressPK содержит ключи addressId и com.model.StudentPK что-то вроде этого может быть:

<composite-id name="addressPK" class="com.model.AddressPK"> 
    <key-property name="addressId" column="ADDRESS_ID" /> 
    <composite-id name="studentCompositeId" class="com.model.StudentPK"> 
     <key-property name="studentId" type="string"> 
      <column name="ADDRESS_PERSON_ID"/> 
     </key-property> 
     <key-property name="studentName" type="string"> 
      <column name="ADDRESS_PERSON_NAME"/> 
     </key-property> 
    </composite-id> 
</composite-id> 
+0

Хорошо, я попробую это ... –

Смежные вопросы