3

有没有办法使用 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;
  }
}

儿童班

这是一个子类。它在父类中定义了相同的 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);
  }
}

我尝试使用@AttributeOverride注释,但这不起作用,甚至指定了nullable属性。

PS 我正在使用 Hibernate 4.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>子</code> 表 <code>child2</code>

于 2018-06-12T15:16:17.627 回答