如何使用 Hibernate 创建持久化超级对象的子对象的正确方法是什么?
考虑以下示例:
在数据库中被持久化User
ID 为 1,名字为 Kevin,激光名字为 Smith。到时候新Entity的数据库模型扩展了Auditor
这是哪个子类User
。对于继承使用策略JOINED
,sso数据库模型现在有两个表:user and auditor。这些表使用 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
}
审计单位
@Entity
@Table(name = "auditor")
public class Auditor extends User {
// some properties
}
Logic
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中,我们也不能将超类的对象转换为子类,然后填充同一对象的新字段。相反,创建子类的新实例,然后复制字段。
似乎一对一关系映射更适合您所需的功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)