当我尝试保存顶级实体(使用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。
有什么关于最佳实践的建议可以遵循吗?
先感谢您
谢谢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
但是我担心这是否是更好的方法。