6

基本的に次のクラスがあります。

@Entity
@Table( name="user" )
@Inheritance( strategy = InheritanceType.JOINED )
public abstract class User implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue( strategy = GenerationType.IDENTITY )
  @Column( name = "id" )
  private Long id;

  @Column( name = "email_address" )
  private String emailAddress;

  /* getters and setters not shown */
}

@Entity
@Table( name="admin" )
public class Admin extends User implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Column( name = "role" )
  private String role;

  /* getters and setters not shown */
}

Hibernate はデフォルトでテーブルDTYPE varchar(31)に存在する列を使用することを期待していuserます。私のコードが新しい管理オブジェクトを永続化しようとすると、コンソールに次のログが記録されます。

Hibernate: insert into user (email_address) values (?)
Hibernate: insert into admin (role) values (?) 

したがって、Hibernate はuser.DTYPE列を設定しようとせず、データベース内で NULL のままになります。に設定されると予想していましたAdmin

私は何を間違っていますか?@DiscriminatorColumnまた、 User クラスとクラスを明示的に設定しようと@DiscriminatorValueしましたAdmin(また、 User にも追加しようとしました)が、役に立ちませんでした。

4

1 に答える 1

6

を使用する場合、Discriminator 列は実際には必要ありません。また、このバグ レポートInheritanceType.JOINEDに基づくと、休止状態の注釈では機能しないようです。

あなたのコメントでは、「ユーザーオブジェクトを直接インスタンス化できないため、タイプは事前にわかっているため、タイプ識別子は必要ありません」と述べています。そして、それは正しいです。しかし、重要な点は、結合継承の場合、DB から取得されたものの型は、それがどのテーブルから取得されたかに基づいて判断され、列に格納する必要がないということです。

ディスクリミネーター列をサポートするかどうかについては、混乱と議論があるようです。実際、上記のバグは、休止状態チームがサポートすべきではないと判断したため、却下されました。

于 2013-05-10T13:10:15.350 に答える