2012-02-20 3 views
2

У меня есть таблица Project с полямиHibernate: как получить обратно соединенный объект (один к одному)


ID 
PROJECT_BASELINE_ATTRIBUTES_ID (FK for table PROJECT_BASELINE_ATTR) 

Эта таблица имеет следующее отображение


<hibernate-mapping package="com.initech.db.model"> 
    <class name="com.initech.db.model.Project" table="PROJECT"> 

     <id name="id" column="id" type="java.lang.Long"> 
      <meta attribute="use-in-tostring">true</meta> 
      <generator class="sequence"> 
       <param name="sequence">PROJECT_ID_SEQ</param> 
      </generator> 
     </id> 

     <many-to-one name="projectBaselineAttributes" column="PROJECT_BASELINE_ATTRIBUTES_ID" class="com.initech.db.model.ProjectBaselineAttributes" cascade="all" not-null="true"> 
      <meta attribute="use-in-tostring">true</meta> 
     </many-to-one>^ 

    </class> 
</hibernate-mapping> 

соответствующих Класс Project.java имеет поля


private Long id; 
private ProjectBaselineAttributes projectBaselineAttributes; 

Кроме того, у меня есть возможность PROJECT_BASELINE_ATTR, содержащего поле


ID 

Отображение Hibernate:


<hibernate-mapping package="com.initech.db.model"> 
    <class name="com.initech.db.model.ProjectBaselineAttributes" table="PROJECT_BASELINE_ATTR"> 

     <id name="id" column="id" type="java.lang.Long"> 
      <generator class="sequence"> 
       <param name="sequence">PRO_BASE_ATTR_ID_SEQ</param> 
      </generator> 
     </id> 

     <set name="projects" table="PROJECT" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="PROJECT_BASELINE_ATTRIBUTES_ID" precision="22" scale="0" not-null="true" /> 
      </key> 
      <one-to-many class="com.initech.db.model.Project" /> 
     </set> 


    </class> 
</hibernate-mapping> 

Соответствующий класс ProjectBaselineAttributes.java имеет поле


private Long id; 
private Set projects = new HashSet(); 

В настоящее время отображения не является идеальным, поскольку связь между двумя таблицами на самом деле взаимно однозначна, но в ProjectBaselineAttributes у меня есть набор Pro даже несмотря на то, что для одного объекта ProjectBaseLine всегда есть один Projet. Что должно выглядеть отображение для ProjectBaselineAttributes, так что я могу получить соответствующий проект «сингулярно», то есть так, что класс ProjectBaselineAttributes.java будет выглядеть следующим образом:


private Long id; 
private Project project; 

ответ

1

Вот часть Hibernate documentation которой подробно описано, как сопоставить такую ​​двунаправленную ассоциацию «один-к-одному», используя внешний ключ.

<class name="Person"> 
    <id name="id" column="personId"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="address" 
     column="addressId" 
     unique="true" 
     not-null="true"/> 
</class> 

<class name="Address"> 
    <id name="id" column="addressId"> 
     <generator class="native"/> 
    </id> 
    <one-to-one name="person" 
     property-ref="address"/> 
</class> 

create table Person (personId bigint not null primary key, addressId bigint not null unique) 
create table Address (addressId bigint not null primary key) 
1

Вы можете попробовать следующие отображения, как сказано в этом example.

В родительском компоненте,

<one-to-one name="one2oneSubA1" class="com.manu.hibernate.mappings.domain.ASub1" cascade="all" 
      property-ref="parent"/> 

В детской боба,

<many-to-one name="parent" 
      class="com.manu.hibernate.mappings.domain.AMain" column="a_id" 
      unique="true" cascade="save-update" /> 

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

  • Нет связанных вопросов^_^