我有下表(伪代码):
conversations
id bigserial
subscribers
id serial
asset_categories
id smallserial
requirements
id serial
requireable_type text
requireable_id bigint
对于 Hibernate,我有一个与此类似的 MappedSuperclass:
@MappedSuperclass
public abstract class BaseEntity<T extends Serializable> {
private T id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public T getId() {
return id;
}
}
我有这些实体:
Conversation<Long>
Subscriber<Integer>
AssetCategory<Short>
Requirement<Integer>
如您所见,requirements.requireable_type 和 requirements.requireable_id 支持与其他三种类型的多态关联(并且 requireable_id 的 bigint 涵盖外键的 id 类型)。
但是我还想不出如何在我的需求实体中实现这一点。
我曾尝试过@Any
这样的操作Requirement
:
@Any(fetch = FetchType.LAZY)
@AnyDiscriminator(DiscriminatorType.STRING)
@AnyDiscriminatorValues({
@AnyDiscriminatorValue(discriminator = "subscriber", entity = Subscriber.class),
@AnyDiscriminatorValue(discriminator = "conversation", entity = Conversation.class),
@AnyDiscriminatorValue(discriminator = "asset_category", entity = AssetCategory.class)
})
@AnyKeyJavaClass(Long.class)
@Column(name = "requireable_type")
@JoinColumn(name = "requireable_id")
public Requireable getRequireable() { return requireable; } // I have an interface Requireable they all "implement"
但这样就只有对话可以关联,并且要求可以保留。其他的都会失败,并出现以下错误:java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
这似乎是一个足够正常的场景,其中多态关系是与具有不同类型标识符的各种表相关的。
那么……我该如何支持这种关系?我应该抛弃注释@Any
并创建……一些东西吗?CompositeUserType?