0

私は2つのテーブルを持っています:UserExtendedUserを継承しています。しかし、既存のUserUserExtendedに昇格することはできません。Hibernate継承(TABLE_PER_CLASS)テーブル展開

エンティティ:

@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 failsemailため、列がDB内のNULLではありません。

userExt.setEmail(user.getEmail());行のコメントを外すときは、emailが一意である必要があるため、別の例外SQLServerException: Cannot insert duplicate key row in object 'User' with unique index 'UQ_User_email'. The duplicate key value is ([email protected])が発生します。

プレーンSQLでの挿入はINSERT INTO UserExtended (id) VALUES (13);として実行できます。HibernateとSpring Data JPAを使用して同じことを行うにはどうすればよいですか?

答えて

3

あなたは(UserExtendedUserある)と同じIDで(と同じ電子メール、あなたのケースで)同じタイプの2つの異なる実体を持たないかもしれません。だからうまくいかない。 Javaの場合と同様に、オブジェクトには唯一の具体的な型が1つあり、他のものになることはできません。

別のサブタイプで再作成する前に、最初にユーザーを削除する必要があります(もちろん、多くのFK制約を破ることができます)。

継承はここでは賢明な選択ではありません。代わりに、ユーザーがUserExtensionを持っている(または持たない)compositionを使用する必要があります。

関連する問題