使用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)
逻辑
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); // ... }
我希望问题很明确,如果不是,我会尝试改进描述.
我认为 Hibernate 有意限制这种行为。当然,您可以使用本机 SQL 解决方法来完成此操作(就像您已经做的那样)。
在Java中,我们也不能将超类的对象转换为子类,然后填充同一对象的新字段。相反,创建子类的新实例,然后复制字段。
似乎一对一关系映射更适合您所需的功能。
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |