Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Hibernate-manytone-Save-org.Hibernate.transientObject异常:_Hibernate_Jpa - Fatal编程技术网

Hibernate-manytone-Save-org.Hibernate.transientObject异常:

Hibernate-manytone-Save-org.Hibernate.transientObject异常:,hibernate,jpa,Hibernate,Jpa,当我尝试使用JPA保存顶级实体时,我是否需要从数据库中新获取ManyTone映射实体并进行设置,或者我是否只能设置ManyTone映射实体的Id并保存顶级实体? 当不获取新实体时,它抛出:org.hibernate.transientObject异常: 我们正在使用的表结构: DEPARTMENT(DEPARTMENT_ID BIGINT, NAME VARCHAR(128)) EMPLOYEE(EMPLOYEE_ID BIGINT, NAME VARCHAR(128), DEPARTMENT

当我尝试使用JPA保存顶级实体时,我是否需要从数据库中新获取ManyTone映射实体并进行设置,或者我是否只能设置ManyTone映射实体的Id并保存顶级实体? 当不获取新实体时,它抛出:org.hibernate.transientObject异常:

我们正在使用的表结构:

DEPARTMENT(DEPARTMENT_ID BIGINT, NAME VARCHAR(128))

EMPLOYEE(EMPLOYEE_ID BIGINT, NAME VARCHAR(128), DEPARTMENT_ID BIGINT)

Entities:
class Department
{
   @Id
   Long departmentId;
   String name;
   @Version
   Long versionNumber;
}

class Employee
{
   @Id
   Long employeeId;
   String name;
   @ManyToOne
   Department department;
   @Version
   Long versionNumber
}
这两个类都有用于所有字段的setter和getter方法以及默认构造函数,该构造函数将主键作为参数 现在,如果我想保存部门ID为100的员工,我是否需要先获取部门记录,然后在Employee中设置它

我不能通过在Employee和save Employee中设置primary keydepartmentId和设置Department instance直接创建部门实例吗? 当我这样做时,它会抛出org.hibernate.transientObject异常

关于这方面应遵循的最佳实践有何建议


提前谢谢你

如果你想保存父项而不保存每个子项,你需要映射它,就像我记不起确切的语法一样

@ManyToOne(CascadeType = Cascade.All)
Department department;

编辑:我犯了一个错误,把它看成是父母对孩子而不是孩子对父母。遵循ChssPly76的示例。

如果要保存父项而不保存每个子项,则需要映射它,就像我记不起确切的语法一样

@ManyToOne(CascadeType = Cascade.All)
Department department;

编辑:我犯了一个错误,把它看成是父母对孩子而不是孩子对父母。按照ChssPly76的示例进行操作。

如果要将员工实例与新的部门实例关联,可以设置并让Hibernate处理整个过程:

class Employee {
  ...
  @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  Department department;
}
请注意,您不希望使用CascadeType.ALL,因为删除员工不应删除部门

如果,oth,您想将您的雇员实例与现有的`部门实例相关联,那么您最好的方法就是加载它。您可以为此目的使用不会影响数据库的方法


另一种解决方案是在员工身上使用,上面指定的级联将传播到部门。不过,这可能会产生副作用。

如果您想将员工实例与新的“部门实例”相关联,可以设置并让Hibernate处理整个过程:

class Employee {
  ...
  @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  Department department;
}
请注意,您不希望使用CascadeType.ALL,因为删除员工不应删除部门

如果,oth,您想将您的雇员实例与现有的`部门实例相关联,那么您最好的方法就是加载它。您可以为此目的使用不会影响数据库的方法


另一种解决方案是在员工身上使用,上面指定的级联将传播到部门。不过,这可能会有副作用。

谢谢CHSSPY76和Wysawyg

解决办法之一是: 我们将更新员工POJO,如下所示

ManyToOne(fetch=FetchType.EAGER)
@**JoinColumn**(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID", **insertable=false, updatable=false**)
private Department department;

@Column(name = "department_id")
private Long departmentId;
department和departmentId都将有setter和getter方法

现在请看,department和departmentId都映射到同一列department\u ID 我们仅使用部门获取部门详细信息 以及要插入或更新员工的部门ID


但我担心这是否是一种更好的方法。

谢谢ChssPly76和Wysawyg

解决办法之一是: 我们将更新员工POJO,如下所示

ManyToOne(fetch=FetchType.EAGER)
@**JoinColumn**(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID", **insertable=false, updatable=false**)
private Department department;

@Column(name = "department_id")
private Long departmentId;
department和departmentId都将有setter和getter方法

现在请看,department和departmentId都映射到同一列department\u ID 我们仅使用部门获取部门详细信息 以及要插入或更新员工的部门ID


但我担心这是否是一种更好的方法。

啊,我的错,我在键入时没有注意到它是@ManyToOne,而不是反之亦然。是的,喀斯喀特,一切都不好!谢谢我的要求有点不同。我根本不想访问数据库。正如我上面所说的,使用session.load-在刷新/提交之前,它根本不会访问数据库。@ChssPly76您也能看看我的问题吗。Kumar D答案是解决这个问题的唯一方法啊,我的错,我在打字时错过了它是@ManyToOne,而不是反之亦然。是的,喀斯喀特,一切都不好!谢谢我的要求有点不同。我根本不想访问数据库。正如我上面所说的,使用session.load-在刷新/提交之前,它根本不会访问数据库。@ChssPly76您也能看看我的问题吗。库马尔D的答案是解决这个问题的唯一途径我不知道是谁否决了这个问题?他们能证明这一点吗?我不知道是谁否决了这一点?他们能证明吗?