Java Hibernate继承(每类表)表扩展
我有两个表:Java Hibernate继承(每类表)表扩展,java,hibernate,sql-server-2012,spring-data-jpa,table-per-class,Java,Hibernate,Sql Server 2012,Spring Data Jpa,Table Per Class,我有两个表:UserExtended继承自User。但我无法将现有的用户升级为UserExtended 实体: @Entity @Table @Inheritance(strategy = InheritanceType.JOINED) public class User { // columns: id, email, etc. } @Entity @Table @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id"
UserExtended
继承自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:无法将值NULL插入到“email”列、表“User”中;列不允许空值。插入失败
,因为电子邮件
列在数据库中不为空
当我取消注释行userExt.setEmail(user.getEmail())时代码>我收到另一个异常SQLServerException:无法在具有唯一索引“UQ\u User\u email”的对象“User”中插入重复的键行。重复的键值为(xxx@mail.com)
因为电子邮件
应该是唯一的
我可以使用普通SQL作为INSERT插入UserExtended(id)值(13)代码>如何使用Hibernate和Spring数据JPA实现同样的功能?您可能没有两个相同类型的不同实体(一个UserExtended
是一个用户
),并且具有相同的ID(以及相同的电子邮件,在您的情况下)。所以那是行不通的。就像在Java中一样,一个对象只有一个具体类型,不能变成其他类型
在使用另一个子类型重新创建用户之前,必须先删除该用户(当然,这可能会破坏很多FK约束)
继承在这里不是一个明智的选择。您应该改为使用组合:用户有(或没有)UserExtension 您可能没有两个相同类型的不同实体(一个UserExtended
是一个用户
),并且具有相同的ID(在您的情况下是相同的电子邮件)。所以那是行不通的。就像在Java中一样,一个对象只有一个具体类型,不能变成其他类型
在使用另一个子类型重新创建用户之前,必须先删除该用户(当然,这可能会破坏很多FK约束)
继承在这里不是一个明智的选择。您应该改为使用组合:用户有(或没有)UserExtension