Java 如何映射属性,如映射<;类,抽象实体>;冬眠?
Hibernate是否有可能执行以下实体结构Java 如何映射属性,如映射<;类,抽象实体>;冬眠?,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,Hibernate是否有可能执行以下实体结构 @Entity public class Person { @OneToMany private Map<Class<? extends PersonRole>, PersonRole> personRoles; public <T extends PersonRole> T getRole(Class<T> roleClass) { return role
@Entity
public class Person {
@OneToMany
private Map<Class<? extends PersonRole>, PersonRole> personRoles;
public <T extends PersonRole> T getRole(Class<T> roleClass) {
return roleClass.cast(roles.get(roleClass));
}
}
@Entity
public abstract class PersonRole {
@ManyToOne
private Person person;
}
解决方法可以是使用“简单”的集合并用拦截器填充映射,但我希望不需要额外的基础设施就可以实现这一点。可以实现Hibernate
UserType
,它将类映射到字符串并返回
@OneToMany
@MapKey(name = "className" type=@Type(type="namespace.classToNameUserType"))
private Map<Class<? extends PersonRole>, PersonRole> personRoles;
@OneToMany
@MapKey(name=“className”type=@type(type=“namespace.classtonNameUserType”))
privatemap可以实现HibernateUserType
,它将类映射到字符串并返回
@OneToMany
@MapKey(name = "className" type=@Type(type="namespace.classToNameUserType"))
private Map<Class<? extends PersonRole>, PersonRole> personRoles;
@OneToMany
@MapKey(name=“className”type=@type(type=“namespace.classtonNameUserType”))
私有映射在我看来,问题基本上是,hibernate需要依赖映射键的持久属性。因此,该解决方案向抽象类角色添加了一个新属性:
private Class className=this.getClass();
然后可以在类Person中的@MapKey注释中引用它:
@OneToMany
@MapKey(name = "className")
private Map<Class<? extends PersonRole>, PersonRole> personRoles;
@OneToMany
@映射键(name=“className”)
私有映射在我看来,问题基本上是,hibernate需要依赖映射键的持久属性。因此,该解决方案向抽象类角色添加了一个新属性:
private Class className=this.getClass();
然后可以在类Person中的@MapKey注释中引用它:
@OneToMany
@MapKey(name = "className")
private Map<Class<? extends PersonRole>, PersonRole> personRoles;
@OneToMany
@映射键(name=“className”)
私人地图单凭这一点是行不通的。但您的回答为我指出了一个更简单的解决方案:向PersonRole添加一个class类型的属性“className”,并用getClass()初始化它。有了这个星座,我不需要任何用户类型。我应该将此作为答案发布吗?仅此一项是行不通的。但您的回答为我指出了一个更简单的解决方案:向PersonRole添加一个class类型的属性“className”,并用getClass()初始化它。有了这个星座,我不需要任何用户类型。我应该把这个作为答案吗?