Hibernate 如何使用JPA和Spring在同一persistence.xml中使用两个不同的实体?

Hibernate 如何使用JPA和Spring在同一persistence.xml中使用两个不同的实体?,hibernate,spring-mvc,jpa,websphere,portlet,Hibernate,Spring Mvc,Jpa,Websphere,Portlet,我正在尝试构建一个springmvcportlet,它通过JPA与MySQL数据库的两个不同表进行交互。我读过7篇不同的帖子,都是关于这个话题和我所犯的错误,但都没有帮到我。如果我只使用这些表中的一个,程序运行得很好,但是如果我将另一个表添加为实体,我会得到一个错误。这两个实体类都是由IBM的RationalApplicationDeveloper的JPA工具自动生成的 我的消息来源: 原因*Manager.java几乎相同我只发布了一次代码: //imports @SuppressWarni

我正在尝试构建一个
springmvc
portlet,它通过JPA与
MySQL
数据库的两个不同表进行交互。我读过7篇不同的帖子,都是关于这个话题和我所犯的错误,但都没有帮到我。如果我只使用这些表中的一个,程序运行得很好,但是如果我将另一个表添加为
实体
,我会得到一个错误。这两个实体类都是由IBM的
RationalApplicationDeveloper
JPA工具
自动生成的

我的消息来源:

原因
*Manager.java
几乎相同我只发布了一次代码:

//imports
@SuppressWarnings("unchecked")
@JPAManager(targetEntity = entities.BookTbl.class)
public class BookTblManager {

private EntityManagerFactory emf;

public BookTblManager() {
    emf = EMFProvider.getEMF();
}

public BookTblManager(EntityManagerFactory emf) {
    this.emf = emf;
}

public void setEntityManagerFactory(EntityManagerFactory emf) {
    this.emf = emf;
}

private EntityManager getEntityManager() {
    if (emf == null) {
        throw new RuntimeException(
                "The EntityManagerFactory is null.  This must be passed in to the constructor or set using the setEntityManagerFactory() method.");
    }
    return emf.createEntityManager();
}
//Create, delete, update methods
My
EMFProvider.java
(EntityManagerFactory提供程序):

My
persistence.xml

...
<persistence-unit name="SpringJPA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>entities.User</class>
    <class>entities.BookTbl</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/portlet" />
        <property name="javax.persistence.jdbc.user" value="admin" />
        <property name="javax.persistence.jdbc.password" value="password" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>
...
我正在使用WebSpherePortalServer8.5、Spring4.3.2、Hibernate5.1和JPA2.1


我尝试了在其他帖子中提到的关于这个错误的任何解决方案,但没有任何效果。我不想使用两个不同的数据库,我不想在一个类中使用两个表。

尝试使用WebSphere Application Server中的classloader查看器解决类加载问题

尝试使用WebSphere Application Server中的classloader查看器解决类加载问题

这可能是由于WebSphereV8.5不支持JPA2.1。它只支持JPA2.0API。因此,JPA2.0API是由WebSphere加载的,而此API不足以(与冲突)用于此版本的Hibernate,因为它基于JPA2.1

如果您希望在WebSphereV8.5中使用JPA2.1,那么您将仅限于使用应用程序管理的持久性。有关此配置和用法的更多详细信息,请参见:
这可能是因为WebSphereV8.5不支持JPA2.1。它只支持JPA2.0API。因此,JPA2.0API是由WebSphere加载的,而此API不足以(与冲突)用于此版本的Hibernate,因为它基于JPA2.1

如果您希望在WebSphereV8.5中使用JPA2.1,那么您将仅限于使用应用程序管理的持久性。有关此配置和用法的更多详细信息,请参见:

“NoSuchMethodError:javax/persistence/Table.indexes()”:您已经弄乱了JPA API jar和JPA提供程序jar版本。在类路径的某个地方有一个JPAPIv2.0JAR。是的,您说您有JPA2.1,但也有一个JPAAPIV2.0JAR,它是首先解决的。2个实体与问题无关,可能会重复检查。但是,如果我移除其中一个实体,为什么protlet可以毫无问题地工作呢?你的意思是让它取决于哪个JPAAPIJAR首先被加载的机会。我已经检查了三次我的类路径,确定没有JPA API v.2.0。“NoSuchMethodError:javax/persistence/Table.indexes()”:您已经弄乱了JPA API jar和JPA提供程序jar版本。在类路径的某个地方有一个JPAPIv2.0JAR。是的,您说您有JPA2.1,但也有一个JPAAPIV2.0JAR,它是首先解决的。2个实体与问题无关,可能会重复检查。但是,如果我移除其中一个实体,为什么protlet可以毫无问题地工作呢?你的意思是让它取决于哪个JPAAPIJAR首先被加载的机会。我已经检查了我的类路径三次,确定没有JPA API v.2.0。我删除了JPA 2.1,因为您说过WebSphereV8.5不支持JPA 2.1,IBM已经提供了JPA 2.0。但是hibernate 5.1使用了JPA v2.1提供的
javax.persistence.AttributeConverter
,因此我使用了hibernate v4.2.21,一切正常。我删除了JPA 2.1,因为您说过WebSphere v8.5不支持JPA 2.1,IBM已经提供了JPA 2.0。但是hibernate 5.1使用了JPA v2.1提供的
javax.persistence.AttributeConverter
,因此我改用hibernate v4.2.21,一切正常。
...
<persistence-unit name="SpringJPA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>entities.User</class>
    <class>entities.BookTbl</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/portlet" />
        <property name="javax.persistence.jdbc.user" value="admin" />
        <property name="javax.persistence.jdbc.password" value="password" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>
...
Caused by: java.lang.NoSuchMethodError: javax/persistence/Table.indexes()[Ljavax/persistence/Index;
at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:1108)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:774)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:848)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:875)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135)
at com.ibm.ws.jpa.management.JPAPUnitInfo.createEMFactory(JPAPUnitInfo.java:1584)
at com.ibm.ws.jpa.management.JPAPUnitInfo.createEntityManagerFactory(JPAPUnitInfo.java:1406)
at com.ibm.ws.jpa.management.JPAPxmlInfo.extractPersistenceUnits(JPAPxmlInfo.java:246)
at com.ibm.ws.jpa.management.JPAScopeInfo.processPersistenceUnit(JPAScopeInfo.java:119)
at com.ibm.ws.jpa.management.JPAApplInfo.processModulePUs(JPAApplInfo.java:167)
at com.ibm.ws.jpa.management.AbstractJPAComponent.startingModule(AbstractJPAComponent.java:451)
at com.ibm.ws.jpa.management.JPAComponentImpl.startingDeployedModule(JPAComponentImpl.java:729)
at com.ibm.ws.jpa.management.JPAComponentImpl.adjust(JPAComponentImpl.java:549)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.adjust(ApplicationMgrImpl.java:1069)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectAdjust(DeployedApplicationImpl.java:1394)
at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:627)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968)
... 66 more