java - Hibernate 在创建时设置交叉引用

标签 java hibernate hibernate-mapping cross-reference

我有两个实体,Project 和 ProjectFee:

public class Project implements Serializable {
    private Integer id;
    //some more fields
    private Set<ProjectFees> fees = new LinkedHashSet<>();
}

public class ProjectFee implements Serializable {
    //some more fields
    private Integer idProject; //id of the Project ProjectFee is related to
}

映射为:

<class name="com.package.Project" table="project">
    <id name="id" type="java.lang.Integer">
        <column name="id" />
        <generator class="identity" />
    </id>
    <!-- more fields -->
    <set name="fees" table="project_fees" cascade="all" fetch="join" lazy="false">
        <key>
            <column name="id_project"/>
        </key>
        <one-to-many class="com.package.ProjectFees"/>
    </set>

</class>

<class name="com.package.ProjectFees" table="project_fees">
    <!-- more fields -->
    <property name="idProject" type="java.lang.Integer">
        <column name="id_project" />
    </property>
</class>

因此,当我尝试使用级联创建一个新项目和一个新项目费用时,我收到一个错误,因为 idProject 在数据库中不能为 null,并且由于项目仍未创建所以它没有设置,所以它没有 ID。我知道我可以通过创建方法来解决它:

  1. 从项目中删除项目费用
  2. 创建项目
  3. 将 ProjectFees 添加到每个项目设置 idProject
  4. 更新项目

但这是一种“肮脏”的方式,所以我想知道是否有某种方法可以自动执行此操作

最佳答案

将您的 ProjectFees 映射更改为:

<many-to-one name="idProject" class="com.gesmifid2.common.model.Project">
    <column name="id_project" />
</many-to-one>

编辑:

您的 ProjectFee 类应如下所示:

public class ProjectFee implements Serializable {
    //some more fields
    private Project project; //project ProjectFee is related to
}

每次您向Project 添加新的ProjectFee 时,您都应该在ProjectFee 中设置该ProjectProject 类中的方法示例:

public void addProjectFee( ProjectFee pf){
    fees.add(pf);
    pf.setProject(this);
}

关于java - Hibernate 在创建时设置交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47547565/

相关文章:

java - Hibernate——从任意字段加载记录

java - hibernate 中的异常 "org.hibernate.PersistentObjectException"

java - Hibernate afterAfterTransactionCompletion 拦截器

java - hibernate jpa 更新两个字段并仅从一个字段读取

java - 使用 ./gradlew run 执行任务 ':app:compileJava' 失败

java - 带有 XMLEventWriter 的自关闭标签

java - Docker/var/lib/docker/devicemapper/devicemapper 使用 2.7GB

java - Jsoup - 获取仅包含指定属性及其值的 HTML 标记

hibernate - 我可以在 NHibernate 中查询派生字段吗?

hibernate-mapping - Hibernate 一对一映射