我可以在Hibernate每层次表继承策略中跨子类重用一列吗?

时间:2010-04-15 16:03:57

标签: java hibernate inheritance

在简单的继承树中,抽象超类有两个子类。

子类都存储一个键值对,但是其中一个将保存一个加密字符串类型,另一个将保存一个普通的旧字符串。

现在,我的问题是我可以这样做:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract Attribute {
    @Id
    private Integer id;

    @Column(name="attribute_key")
    private String key;
}

@Entity
public EncryptedAttribute extends Attribute {
    @Column(name="attribute_value")
    private EncryptedString encryptedValue;
}

@Entity
public UnEncryptedAttribute extends Attribute {
    @Column(name="attribute_value")
    private String plainValue;        
}

加密字符串和普通字符串应最终作为db中的varchars,但是我可以在同一列中存储与不同子类关联的持久属性吗?这样可以避免在未在特定行中使用的列中存储空值的“瑞士奶酪”副作用。

1 个答案:

答案 0 :(得分:5)

是的,你可以。 (我会在你的情况下这样做)

但是,您会遇到一些限制: 两个属性都具有相同的最大长度。

在外键之间共享像子类之间的列更值得怀疑的地方。假设您希望两个外键(每个子类中有一个)引用不同的表,如果使用相同的列,则无法设置外键约束。

另一方面,如果两个外键都是必需的,但您选择使用两个不同的列以便可以使用fk约束,则无法设置非空约束。