一尘不染

Hibernate-ManyToOne-保存-org.hibernate.TransientObjectException:

hibernate

当我尝试保存顶级实体(使用JPA)时,我是否需要从数据库中重新获取ManyToOne映射实体并进行设置,还是不能仅设置(ManyToOne映射实体的ID并保存顶级实体?)它抛出的实体:org.hibernate.TransientObjectException:

我们正在使用的表结构:

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方法以及默认构造函数,该构造函数以主键作为参数)现在,如果我想保存具有DepartmentId(例如100)的Employee,我是否需要先获取Department记录然后进行设置在员工?

我不能直接创建Department的实例(通过设置主键(departmentId))并在Employee中设置Department实例并保存Employee吗?当我这样做时,它将引发org.hibernate.TransientObjectException。

有什么关于最佳实践的建议可以遵循吗?

先感谢您


阅读 298

收藏
2020-06-20

共1个答案

一尘不染

谢谢ChssPly76和Wysawyg。

解决方法之一可能是:我们将如下更新Employee 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_ID)),我们仅使用 department
来获取Department的详细信息,并使用departmentId来插入或更新 Employee

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

2020-06-20