Hibernate继承(TABLE_PER_CLASS)table扩展
Hibernate inheritance (TABLE_PER_CLASS) table expansion
我有两个表: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 column 'email', table 'User'; column does not allow nulls. INSERT fails
因为 email
列在数据库中不为空。
当我取消注释行 userExt.setEmail(user.getEmail());
时,我得到另一个异常 SQLServerException: Cannot insert duplicate key row in object 'User' with unique index 'UQ_User_email'. The duplicate key value is (xxx@mail.com)
因为 email
应该是唯一的。
我可以使用纯 SQL 进行插入,因为 INSERT INTO UserExtended (id) VALUES (13);
我如何使用 Hibernate 和 Spring Data JPA 进行同样的操作?
您不能拥有相同类型(一个 UserExtended
是一个 User
)并且具有相同 ID(和相同电子邮件,在你的情况下)。所以那是行不通的。就像,在Java中,一个对象只有一种具体类型,不能变成别的东西。
您必须先删除用户(这当然会破坏很多 FK 约束),然后再使用其他子类型重新创建它。
继承在这里不是一个明智的选择。您应该改用组合:用户有(或没有)UserExtension。
我有两个表: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 column 'email', table 'User'; column does not allow nulls. INSERT fails
因为 email
列在数据库中不为空。
当我取消注释行 userExt.setEmail(user.getEmail());
时,我得到另一个异常 SQLServerException: Cannot insert duplicate key row in object 'User' with unique index 'UQ_User_email'. The duplicate key value is (xxx@mail.com)
因为 email
应该是唯一的。
我可以使用纯 SQL 进行插入,因为 INSERT INTO UserExtended (id) VALUES (13);
我如何使用 Hibernate 和 Spring Data JPA 进行同样的操作?
您不能拥有相同类型(一个 UserExtended
是一个 User
)并且具有相同 ID(和相同电子邮件,在你的情况下)。所以那是行不通的。就像,在Java中,一个对象只有一种具体类型,不能变成别的东西。
您必须先删除用户(这当然会破坏很多 FK 约束),然后再使用其他子类型重新创建它。
继承在这里不是一个明智的选择。您应该改用组合:用户有(或没有)UserExtension。