3

HibernateまたはJPAアノテーションを使用して、サブクラスのフィールドのオプションをオーバーライドする方法はありますか?次の例を見てください。

親クラス

これは、いくつかの一般的なフィールドを定義する基本クラスです。以下の例では、いくつかのサブクラスでオーバーライドする単一のフィールドを示しています。で@MappedSuperclass、このフィールドは必須です(nullは許可されません)。

@MappedSuperclass
public abstract class GenericLog {
  protected String sessionId;

  @Basic(optional = false)
  @Column(name = FIELD__SESSION_ID__COLUMN, length = 50)
  public String getSessionId() {
    return sessionId;
  }

  public void setSessionId(String sessionId) {
    this.sessionId = sessionId;
  }
}

チャイルドクラス

これはサブクラスです。親クラスで定義されているのと同じsessionIdフィールドがありますが、唯一の違いは、フィールドがこのクラスでnullを許可する必要があることです。

@Entity
@Table(name = LogError.TABLE_NAME)
@Cache(usage = CacheConcurrencyStrategy.NONE)
public class LogError extends GenericLog {
  @Basic(optional = true)
  @Column(name = FIELD__SESSION_ID__COLUMN, length = 50)
  @Override
  public String getSessionId() {
    return super.getSessionId();
  }

  @Override
  public void setSessionId(String sessionId) {
    super.setSessionId(sessionId);
  }
}

アノテーションを使ってみましたが、プロパティ@AttributeOverrideを指定してもうまくいきませんでした。nullable

PS私はHibernate4.1.9(JPA 2.0アノテーション)を使用しています。

4

1 に答える 1

3

と の間に文書化されていない相互作用が@Basicあり@Column、 の効果を妨げていると思います@AttributeOverride

を削除して@Basic、アノテーションをメソッドレベルではなくフィールドレベルに移動すると、私にとってはうまくいきました:

これが私のセットアップです:

@MappedSuperclass
public abstract class GenericLog {

  @Column(name = "sessionId", length = 50, nullable = false)
  protected String sessionId;

  // getter setter here
}

@Entity
@Table(name = "child")
@AttributeOverride(column = @Column(name = "sessionId", length = 50, nullable = true), name = "sessionId")
public class ChildEntity extends SuperClass {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // getter setter here
}

@Entity
@Table(name = "child2")
public class ChildEntity2 extends SuperClass {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // Getter setter here
}

結果は次のとおりです。

テーブル <code>child</code> テーブル <code>child2</code>

于 2018-06-12T15:16:17.627 に答える