Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 Hibernate问题和缺少的实体_Java_Oracle_Hibernate_Jpa - Fatal编程技术网

Java Hibernate问题和缺少的实体

Java Hibernate问题和缺少的实体,java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我们有一个Java应用程序,它使用Hibernate将对象映射到Oracle数据库,虽然一切正常,但有一个特殊的情况会导致问题。首先,对映射进行简要概述: User类,映射到APP\u User,APP\u User是一个表。它具有到OrgUser对象的OneToMany映射: @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user") private Set<OrgUs

我们有一个Java应用程序,它使用Hibernate将对象映射到Oracle数据库,虽然一切正常,但有一个特殊的情况会导致问题。首先,对映射进行简要概述:

User类,映射到APP\u User,APP\u User是一个表。它具有到OrgUser对象的OneToMany映射:

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
    private Set<OrgUser> orgUsers;
组织类,该类映射到实体_VW,它是一个视图。它具有到OrgUser的OneToMany映射:

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "organization")
    private Set<OrgUser> orgUsers;
但是,问题是merge()尝试接触所有相关记录,并且由于组织ORG-00002不再存在,因此引发异常:

Caused by: javax.persistence.EntityNotFoundException: Unable to find Organization with id ORG-00002
    at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:155) ~[hibernate-entitymanager-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:210) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:441) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:995) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:874) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2033) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3719) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:449) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:418) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:441) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.replace(EntityType.java:298) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.AbstractType.replace(AbstractType.java:178) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:211) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:409) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:214) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:904) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:888) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:892) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879) ~[hibernate-entitymanager-4.1.4.Final.jar:4.1.4.Final]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_18]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_18]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_18]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_18]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at $Proxy53.merge(Unknown Source) ~[na:na]
    at OrgUserDao.saveOrgObject(OrgUserDao.java:177) ~[classes/:na]

问题是,有没有一种方法可以把事情安排好,这样就不成问题了?在最坏的情况下,我们可以手动从数据库中删除孤立的实体用户记录,但由于实体可以/将继续从实体VW中删除,这将是一个持续存在的问题。

因此,基本上您是说,除了Hibernate应用程序之外,其他会话直接访问数据库并在那里执行
delete
s。尝试通过更新状态说服他们只进行逻辑删除,并将
版本增加1。这将解决问题。简单回答:我们不能那样做。更详细的回答:这不仅仅是一个用于Java应用程序的数据库,它还用于整个业务,而且有些事情我们无法直接控制。Java应用程序和整个数据库都是遗留系统,进行这样的更改将需要对两者进行重大检修。因此,基本上你是说,除了Hibernate应用程序之外,其他会话直接访问数据库并在那里执行
delete
s。尝试通过更新状态说服他们只进行逻辑删除,并将
版本增加1。这将解决问题。简单回答:我们不能那样做。更详细的回答:这不仅仅是一个用于Java应用程序的数据库,它还用于整个业务,而且有些事情我们无法直接控制。Java应用程序和整个数据库都是遗留系统,进行这样的更改将需要对两者进行重大检修。
    public Object saveOrgObject(Object object) {
        return entityManager.merge(object);
    }
Caused by: javax.persistence.EntityNotFoundException: Unable to find Organization with id ORG-00002
    at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:155) ~[hibernate-entitymanager-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:210) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:441) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:995) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:874) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2033) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3719) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:449) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:418) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:441) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.EntityType.replace(EntityType.java:298) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.AbstractType.replace(AbstractType.java:178) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:211) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:409) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:214) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:904) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:888) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:892) ~[hibernate-core-4.1.4.Final.jar:4.1.4.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879) ~[hibernate-entitymanager-4.1.4.Final.jar:4.1.4.Final]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_18]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_18]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_18]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_18]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) ~[spring-orm-3.1.0.RELEASE.jar:3.1.0.RELEASE]
    at $Proxy53.merge(Unknown Source) ~[na:na]
    at OrgUserDao.saveOrgObject(OrgUserDao.java:177) ~[classes/:na]