gpt4 book ai didi

java - 如何使用 JOINED 继承策略和 Hibernate 创建现有 super 对象的子对象

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:04 25 4
gpt4 key购买 nike

使用 Hibernate 创建持久化 super 对象的子对象的合适方法是什么?

考虑以下示例:在数据库中持久化了 ID 为 1 的 User,名字是 Kevin 和 laseName Smith。届时,数据库模型扩展了新实体 Auditor,它是 User 的子类。对于继承,使用策略 JOINED,因此数据库模型现在有两个表:userauditor。这些表使用 user_id FK 连接。

我想创建 Kevin Smith 对象类型 Auditor 并坚持下去。问题是操作是事务性的,Hibernate 抛出 NonUniqueObjectException。存在任何方式如何安全地将持久对象转换为子对象?我试图逐出给定的用户对象,但还是一样。

用户实体

@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
}

逻辑

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 有意限制这种行为。当然,您可以使用 native SQL 变通方法(就像您已经做过的那样)。

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

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

关于java - 如何使用 JOINED 继承策略和 Hibernate 创建现有 super 对象的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26038707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com