我有两个实体,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。我知道我可以通过创建方法来解决它:
- 从项目中删除项目费用
- 创建项目
- 将 ProjectFees 添加到每个项目设置 idProject
- 更新项目
但这是一种“肮脏”的方式,所以我想知道是否有某种方法可以自动执行此操作
最佳答案
将您的 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
中设置该Project
。 Project
类中的方法示例:
public void addProjectFee( ProjectFee pf){
fees.add(pf);
pf.setProject(this);
}
关于java - Hibernate 在创建时设置交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47547565/