Hibernate:覆盖子类中的字段可选性

Ste*_*tez 4 java hibernate jpa

有没有办法使用 Hibernate 或 JPA 注释来覆盖子类中字段的可选性?举个例子:

家长班

这是一个定义了许多公共字段的基类。对于下面的示例,我仅显示我想要在几个子类中覆盖的单个字段。在 中@MappedSuperclass,此字段是必需的(不允许为空)。

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

儿童班

这是一个子类。它具有与父类中定义的相同的 sessionId 字段,唯一的区别是该字段在此类中应允许为空。

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用@AttributeOverride注释,但即使指定属性也不起作用nullable

PS 我正在使用 Hibernate 4.1.9(JPA 2.0 注释)。

Mạn*_*yễn 5

@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
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

表<code>子表</code> 表<code>child2</code>