Java Hibernate在创建时设置两个交叉引用
我有两个实体,Project和ProjectFee:Java Hibernate在创建时设置两个交叉引用,java,hibernate,hibernate-mapping,cross-reference,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 { /
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
}
公共类项目实现可序列化{
私有整数id;
//更多的领域
私人设置费用=新建LinkedHashSet();
}
公共类ProjectFee实现可序列化{
//更多的领域
私有整数idProject;//项目费用的id与
}
映射为:
<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>
因此,当我尝试使用cascade创建一个新项目和一个新项目时,我得到一个错误,因为idProject在db中不能为null,并且它没有设置,因为项目还没有创建,所以它没有id。我知道我可以通过在create方法上执行以下操作来解决它:
但这是一种“肮脏”的方式,因此我想知道是否有某种方法可以自动执行此操作将您的
项目费用
映射更改为:
<many-to-one name="idProject" class="com.gesmifid2.common.model.Project">
<column name="id_project" />
</many-to-one>
每次您将新的ProjectFee
添加到Project
时,您应该在ProjectFee
中设置Project
。项目
类中的方法示例:
public void addProjectFee( ProjectFee pf){
fees.add(pf);
pf.setProject(this);
}
如果您仔细查看您的
ProjectFee
类,它就无法知道这与类Project
(作为外键id\u Project
)有某种关联。这就是为什么当您同时保存这两个对象时,ProjectFee
class不知道它应该使用project
class的id列值填充列id\u project
有两种可能性-
project
对象,然后向ProjectFee
对象提供id,自己填充id\u project
列(如您在问题中提到的)project
的id\u project
属性,在实体中建立外键关系,并在列id/id\u project
上连接两个实体希望这能有所帮助。在关系的两侧设置引用并尝试保持它。@AbdullahKhan问题是我不能这样做,因为我没有Project.id,因为Project在数据库Yets中不存在,直到同一个错误,
原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Column'id_project'不能为空
是的,这可以工作,但我只想让idProject,而不是整个项目在ProjectFee@Aldeguer这实际上是在ORM(双向映射)中处理数据库对象的一种方法。在数据库端,您只能在相应的表中获取id。@AbdullahKhan我知道这是一种处理它们的方法,但这次我需要一些不同的东西:不是获取整个对象,而是id。除了使用“updateable=false,insertable=false”映射项目外,您还可以映射id(需要,因为您将映射同一列两次)。第一个是我已经在做的,第二个无效,因为我希望idProject是整数而不是投影如果您想id\u project
作为整数,那么您必须自己设置它(正如您已经做的那样)因为只有当您创建双向映射(您不想这样做)时,按框架自动设置值才会起作用。
public void addProjectFee( ProjectFee pf){
fees.add(pf);
pf.setProject(this);
}