Можно ли повторно использовать столбец в подклассах в стратегии наследования таблиц в иерархии Hibernate? - PullRequest
2 голосов
/ 15 апреля 2010

В простом дереве наследования абстрактный суперкласс имеет два подкласса.

Оба подкласса хранят пару ключ-значение, но один будет содержать тип Encrypted String, а другой - старую String.

Теперь мой вопрос: могу ли я сделать это:

@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;        
}

Encrypted String и plain String должны заканчиваться как varchars в БД, но могу ли я хранить постоянные атрибуты, связанные с различными подклассами, в одном столбце? Это позволило бы избежать побочного эффекта «швейцарского сыра» хранения нулевых значений в столбцах, которые не используются в определенной строке.

1 Ответ

5 голосов
/ 16 апреля 2010

Да, вы можете. (И я бы сделал это в вашем случае)

Однако вы столкнетесь с некоторыми ограничениями: оба свойства будут иметь одинаковую максимальную длину.

Там, где совместное использование подобного столбца между подклассами более сомнительно, связано с внешними ключами. Предположим, что вы хотите, чтобы два внешних ключа (по одному в каждом подклассе) ссылались на разные таблицы, вы не сможете установить ограничение внешнего ключа, если используете один и тот же столбец.

С другой стороны, если оба внешних ключа являются обязательными, но вы решили использовать два разных столбца, чтобы иметь ограничения fk, вы не сможете установить ограничение не равным нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...