Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.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
Hibernate 在联合子类映射中,子类如何声明所需的依赖关系?_Hibernate_Hibernate Mapping - Fatal编程技术网

Hibernate 在联合子类映射中,子类如何声明所需的依赖关系?

Hibernate 在联合子类映射中,子类如何声明所需的依赖关系?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,我对将@ManyToOne(optional=false)实体映射添加到作为参与联合子类映射的子类的类感到困惑。设置如下所示: @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "person") private Set<Role> roles; }

我对将
@ManyToOne(optional=false)
实体映射添加到作为参与联合子类映射的子类的类感到困惑。设置如下所示:

@Entity
public class Person {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "person")
    private Set<Role> roles;
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Role {
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen")
    @SequenceGenerator(name = "gen", sequenceName = "id_seq", 
            initialValue =  1, allocationSize = 1)
    protected Long id;

    @ManyToOne(optional = false, cascade = { CascadeType.PERSIST, 
         CascadeType.REFRESH, CascadeType.MERGE })
    protected Person person;
}

@Entity
public class A extends Role {
    @ManyToOne(optional = false)
    private Status status = Status.INIT;
}

@Entity
public class B extends Role {
    String login;
}
该行执行了一系列select语句以重新加载实体图,其中一条如下所示:

select role0_.id, role0_.person_id, role0_.login, role0_.status_id,
    person1_.id,
    status2_.id, status2_.code, status2_.visible
from
    (select id, person_id, login, null::int8 as status_id, 1 as clazz_
        from public.A
    union all select id, person_id, null::varchar as login, status_id, 2 as clazz_
        from public.B) role0_
inner join public.Person person1_ on role0_.person_id = person1_.id
inner join public.Status status2_ on role0_.status_id = status2_.id
where role0_.id=?
在这句话之后,我得到了一个例外:

javax.persistence.EntityNotFoundException:找不到id为2的my.company.Role

stacktrace的一部分:

Caused by: javax.persistence.EntityNotFoundException: Unable to find my.company.Role with id 2
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:181) [hibernate-entitymanager-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:263) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1025) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:952) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:681) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.resolve(EntityType.java:499) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.replace(EntityType.java:354) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:518) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.CollectionType.replace(CollectionType.java:661) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.TypeHelper.replace(TypeHelper.java:177) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:374) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:311) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:153) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
问题是
Role.id=2
的实体属于
B类
,因此没有
状态\u id
,因此不存在于选择的结果集中

我的问题很简单:Hibernate/JPA是否不支持上面描述的必需属性?如果支持,我可以做些什么来记录并强制执行此依赖项的“非空性”

Caused by: javax.persistence.EntityNotFoundException: Unable to find my.company.Role with id 2
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:181) [hibernate-entitymanager-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:263) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1025) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:952) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:681) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.resolve(EntityType.java:499) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.EntityType.replace(EntityType.java:354) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:518) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.CollectionType.replace(CollectionType.java:661) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.type.TypeHelper.replace(TypeHelper.java:177) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:374) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:311) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]
        at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:153) [hibernate-core-4.3.0.CR1.jar:4.3.0.CR1]