有没有办法使用 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
}
结果如下:
关于java - Hibernate:覆盖子类中的字段可选性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382510/