Hibernate: как получить обратно соединенную сущность (один к одному) - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть таблица Проект с полями


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 у меня есть набор проектов, даже если для одного ProjectBaseLineattributes всегда есть один Projet. Как должно выглядеть сопоставление для ProjectBaselineAttributes, чтобы я мог получить связанный проект «по отдельности», т.е. чтобы класс ProjectBaselineAttributes.java выглядел так:


private Long id;
private Project project;

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

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

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

<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" />
1 голос
/ 20 февраля 2012

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

<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 )
...