如何使用JOINED继承策略和Hibernate创建现有超级对象的子对象

Pet*_*vic 5 java hibernate

使用Hibernate创建持久超级对象的子对象的适当方法是什么?

请考虑以下示例:在数据库中持久保存UserID 1,firstName Kevin和laseName Smith.到时候是Auditor作为子类的新实体的数据库模型扩展了User.对于继承是使用策略JOINED,因此数据库模型现在有两个表:用户审计员.这些表使用user_id FK连接.

我想创建Kevin Smith对象类型的Auditor并坚持下去.问题是操作是事务性的,而Hibernate会抛出NonUniqueObjectException.以任何方式存在如何安全地转换持久化对象做子对象?我试图驱逐给定的User对象,但仍然是相同的.

用户实体

@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User{

    private Long id;
    private String firstName;
    private String lastName;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

审计实体

@Entity
@Table(name = "auditor")
public class Auditor extends User {
  // some properties
}
Run Code Online (Sandbox Code Playgroud)

逻辑

public void createAuditorOfUser(final long userId) {
  final User user = userService.getUserById(userId);
  // ...
  final Auditor auditor = new Auditor();
  auditor.setId(user.getId());
  auditor.setFirstName(user.getFirstName());
  auditor.setLastName(user.getLastName());
  userService.evict(user);
  // will throw  NonUniqueObjectException
  auditorService.update(auditor);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我希望问题很明确,如果不是,我会尝试改进描述.

hsn*_*rmn 3

我认为 Hibernate 有意限制这种行为。当然,您可以使用本机 SQL 解决方法来完成此操作(就像您已经做的那样)。

在Java中,我们也不能将超类的对象转换为子类,然后填充同一对象的新字段。相反,创建子类的新实例,然后复制字段。

似乎一对一关系映射更适合您所需的功能。