Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate继承(每类表)表扩展_Java_Hibernate_Sql Server 2012_Spring Data Jpa_Table Per Class - Fatal编程技术网

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