0

我有两个表: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因为emailDB 中的列不为空。

当我取消注释该行时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 来做同样的事情?

4

1 回答 1

3

您可能没有两个相同类型(aUserExtended 是 a User)且具有相同 ID(在您的情况下是相同的电子邮件)的不同实体。所以这行不通。就像在 Java 中,一个对象只有一个具体类型,不能变成别的东西。

在使用另一个子类型重新创建用户之前,您必须先删除用户(这当然会破坏很多 FK 约束)。

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

于 2017-05-30T10:44:05.420 回答