Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate在创建时设置两个交叉引用_Java_Hibernate_Hibernate Mapping_Cross Reference - Fatal编程技术网

Java Hibernate在创建时设置两个交叉引用

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 { /

我有两个实体,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
}
公共类项目实现可序列化{
私有整数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方法上执行以下操作来解决它:

  • 从项目中删除项目费用
  • 创建项目
  • 将项目费用添加到每个项目的项目设置idProject中
  • 更新项目

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

    将您的
    项目费用
    映射更改为:

    <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);
    }