java - Hibernate:如何获得反向连接的实体(一对一)

标签 java hibernate join one-to-one

我有一个带有字段的表项目


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 中我有一组项目,即使一个 ProjectBaseLine 属性总是有一个 Projet。 ProjectBaselineAttributes 的映射应该是什么样子,以便我可以“单独”获取关联的项目,即类 ProjectBaselineAttributes.java 看起来像这样:


private Long id;
private Project project;

最佳答案

这是 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 )

关于java - Hibernate:如何获得反向连接的实体(一对一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9362430/

相关文章:

java - 为什么我在部署以下 mule flow 时遇到 "inputstream payload cant be distributed"由于 ObjectStoreException?

java - 随机文件访问 Java

java.sql.SQLException : Column 'JOB_ID' not found

java - hibernate 无法获得正确的结果集

mysql - 通过连接从其他表获取名称

performance - sql连接查询中表别名的重要性是什么?

Java 8 : Stream optimization, 在同一个实例上调用同一个方法两次

java - csv 到字符串数组的数组

hibernate - 没有外键的 JPA 关联

Oracle:合并具有不同列的两个表