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

标签 java hibernate jpa

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

父类

这是一个定义了许多公共(public)字段的基类。对于下面的例子,我只是展示了一个我想在几个子类中覆盖的字段。在@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 属性。

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

最佳答案

我认为 @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
}

结果如下:

Table <code>child</code> Table <code>child2</code>

关于java - Hibernate:覆盖子类中的字段可选性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382510/

相关文章:

java - Hibernate HQL批量删除不删除连接表值

java - Java中的堆栈溢出

java - Android 用 2 个 ArrayList 填充 Spinner

java - "No Persistence Unit Found"错误

java - Hibernate 返回设置为 EAGER 的对象的代理

java - 将没有主键的 SQL View 映射到 JPA 实体

java - Android:调用 EditText getText() 方法时出现 NullPointerException

java - Java 系统属性存储在 Mac 上的什么位置?

java - 在 OneToMany 中使用 Hibernate 持久保存对象

java - JPA/Hibernate 是否支持迁移?