当前位置: 首页 > 面试题库 >

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

罗均
2023-03-14
问题内容

当我尝试保存顶级实体(使用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

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



 类似资料:
  • 我在保存具有ManyToOne双向关系的实体时遇到问题,如下所示: 警告:HHH000437:试图保存一个或多个与未保存的瞬态实体具有不可为空的关联的实体。在保存这些从属实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com . epam . apartments booking . model . city # 912])依赖实体:([[com . epam . apartme

  • 当我调用hibernate save时,我会面临这个异常,我不知道如何解决这个问题。在我的例子中,我将join列从PrimaryKey更改为另一列,因此我面临这个异常。我不想保存客户与承销商和我只想保存外键。 我的域模型是:

  • 问题内容: 我看不到“多对一”关系与“一对一”关系的架构有什么区别: 与 有什么区别吗? 问题答案: 它们在架构上看起来完全相同,但是在Hibernate Layer上有所不同。 如果尝试这样的操作: 一切都会好起来的。但是,保存后,如果您尝试获取订单: 当然,在两种情况下,您的Address类应该看起来有所不同。

  • 问题内容: 我目前正在阅读有关实体关联的Hibernate文档,但遇到一些困难却难以理解。它在本质上做的区别和联系。尽管我在实际项目中使用了它们,但是我无法完全理解它们之间的差异。据我了解,如果一个表/一个实体与另一个实体有关联,则该关联应来自另一侧。那么,我们应该如何根据具体情况决定选择哪个呢?它又如何影响数据库/查询/结果?到处都有很好的例子吗? PS:我认为这与问题相关,如果有人可以解释关联

  • 问题内容: 我正在使用Hibernate3.3.1,我想在人员和指定公司之间建立关系。他们应该松耦合,但我想安排通过级联创建公司,而不是显式调用saveOrUpdate(newCompany)。 我定义了以下实体: 在我的小岛内,我正在执行以下操作: 我得到一个例外 org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例- 在刷新之前保存该瞬态

  • 用户详细信息 有人能看出我做错了什么吗?