Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何映射属性,如映射<;类,抽象实体>;冬眠?_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java 如何映射属性,如映射<;类,抽象实体>;冬眠?

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

Hibernate是否有可能执行以下实体结构

@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可以实现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”))

私有映射在我看来,问题基本上是,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()初始化它。有了这个星座,我不需要任何用户类型。我应该把这个作为答案吗?