gpt4 book ai didi

java - Hibernate继承(TABLE_PER_CLASS)表扩展

转载 作者:行者123 更新时间:2023-12-01 20:23:29 26 4
gpt4 key购买 nike

我有两个表:UserExtended 继承自User。但我无法将现有的 User 提升为 UserExtended

实体:

@Entity
@Table
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
// columns: id, email, etc.
}

@Entity
@Table
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
public class UserExtended extends User {
// columns
}

服务:

// Repositories
@Autowired
private UserDao userDao;
@Autowired
private UserExtendedDao userExtendedDao;

public void promoteUser() {
User user = userDao.getUserByEmail(email);
UserExtended userExt;

if (user != null) {
if (user instanceof UserExtended) {
// cast UserExtended
userExt = (UserExtended) user;
} else {
// extend User to UserExtended
userExt = new UserExtended();
userExt.setId(user.getId());
// userExt.setEmail(user.getEmail());
userExt = userExtendedDao.save(userExt); // exception here!
}
} else {
// create new UserExtended
}
}

使用此代码我得到异常:SQLServerException: Cannot insert the value NULL into columns 'email', table 'User';列不允许为空。 INSERT 失败,因为数据库中 email 列不为空。

当我取消注释行userExt.setEmail(user.getEmail());时,我得到另一个异常SQLServerException:无法在具有唯一索引“UQ_User_email”的对象“User”中插入重复的键行'。重复的键值为 (xxx@mail.com),因为 email 应该是唯一的。

我可以使用纯 SQL 进行插入,如 INSERT INTO UserExtended (id) VALUES (13); 如何使用 Hibernate 和 Spring Data JPA 执行相同操作?

最佳答案

您不能有两个相同类型的不同实体(UserExtended User)并且具有相同的 ID(并且同一电子邮件,就您而言)。所以这是行不通的。就像在 Java 中一样,一个对象只有一种具体类型,并且不能变成其他类型。

您必须先删除该用户(这当然可以打破许多 FK 约束),然后再使用另一个子类型重新创建该用户。

继承在这里并不是一个明智的选择。您应该使用组合:用户拥有(或没有)UserExtension。

关于java - Hibernate继承(TABLE_PER_CLASS)表扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259677/

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