无法从另一个maven子项目调用Hibernate / QueryDSL

我有两个maven子项目 – jetty_runner1和jetty_runner2

我的目录结构如下所示:

./jetty_runner1/pom.xml ./jetty_runner1/src/main/java/com/jetty_runner1/CheckPersistence.java ./jetty_runner1/src/main/java/com/jetty_runner1/HelloWorldServlet.java ./jetty_runner1/src/main/java/com/jetty_runner1/MiscKeyValue.java ./jetty_runner1/src/main/java/com/jetty_runner1/MiscKeyValueManager.java ./jetty_runner1/src/main/resources/META-INF/persistence.xml ./jetty_runner1/src/main/webapp/WEB-INF/web.xml ./jetty_runner2/pom.xml ./jetty_runner2/src/main/java/com/jetty_runner2/CheckPersistence.java ./jetty_runner2/src/main/java/com/jetty_runner2/HelloWorldServlet.java ./jetty_runner2/src/main/resources/META-INF/persistence.xml ./jetty_runner2/src/main/webapp/WEB-INF/web.xml ./pom.xml 

CheckPersistence.java,HelloWorldServlet.java,persistence.xml和web.xml在两个项目中是完全相同的,除了包名(我已经创建了这个简化的例子,在这里发布。在实际应用中,这两个子项目做完全不同的东西)

以下是实际的文件内容:

CheckPersistence.java

 public class CheckPersistence { public void beginUpdation() { String val = null; List keyValues = MiscKeyValueManager.get().selectStar(); if (keyValues != null && keyValues.size() == 1) val = keyValues.get(0).getStringValue(); if (val == null) val = "Hello World"; MiscKeyValue keyValue = new MiscKeyValue(); keyValue.setStringKey("modifiedDate"); keyValue.setStringValue(val); MiscKeyValueManager.get().put(keyValue); } } 

HelloWorldServlet.java

 public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { new CheckPersistence().beginUpdation(); } } 

MiscKeyValue.java

 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @Entity (name="Misc_Key_Value") public class MiscKeyValue { @Id @Column(name="Misc_Key_Value_id") private String id; @Column(name="string_key") private String stringKey; @Column(name="string_value") private String stringValue; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getStringKey() { return stringKey; } public void setStringKey(String stringKey) { this.stringKey = stringKey; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } } 

MiscKeyValueManager.java

 import java.util.List; import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import com.mysema.query.jpa.impl.JPAQuery; public class MiscKeyValueManager { private static MiscKeyValueManager INSTANCE = new MiscKeyValueManager(); protected EntityManagerFactory emf; public static QMiscKeyValue qmiscKeyValue = QMiscKeyValue.miscKeyValue; private MiscKeyValueManager() { this.emf = Persistence.createEntityManagerFactory("world"); } public static MiscKeyValueManager get() { return INSTANCE; } public List selectStar() { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); JPAQuery query = new JPAQuery(em); List results = query.from(qmiscKeyValue) .fetchAll().list(qmiscKeyValue); tx.commit(); em.close(); return results; } public MiscKeyValue put(MiscKeyValue e) { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); if (e.getId() == null) { e.setId(UUID.randomUUID().toString()); } MiscKeyValue mergedE = em.merge(e); em.flush(); tx.commit(); em.clear(); em.close(); return mergedE; } } 

persistence.xml中

   org.hibernate.jpa.HibernatePersistenceProvider          

web.xml中

    Hello com.jetty_runner1.HelloWorldServlet   Hello /hello/*   

每个pom.xml也包含QueryDSL和Jetty插件:

    org.eclipse.jetty jetty-maven-plugin ${jettyVersion}   com.mysema.maven apt-maven-plugin 1.1.3    process   target/generated-sources/java com.mysema.query.apt.jpa.JPAAnnotationProcessor      com.mysema.querydsl querydsl-apt ${querydsl.version}      

当我运行mvn jetty:从jetty_runner1 运行并点击URL localhost:8080 / hello /时,一切正常,在某种意义上查询执行和更新。

当我从jetty_runner2运行相同的URL并点击相同的URL时,它会给出一个exception说:

org.hibernate.hql.internal.ast.QuerySyntaxException:Misc_Key_Value未映射[从Misc_Key_Value中选择miscKeyValue miscKeyValue获取所有属性]

 at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79) at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:76) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150) at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:298) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1821) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:129) at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:96) at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:248) at com.jetty_runner1.MiscKeyValueManager.selectStar(MiscKeyValueManager.java:35) at com.jetty_runner2.CheckPersistence.beginUpdation(CheckPersistence.java:13) at com.jetty_runner2.HelloWorldServlet.doGet(HelloWorldServlet.java:16) 

经过一番搜索后,我找到了两个解决方案:

1)将您的实体类添加到persistence.xml

2)使用org.hibernate.integrator.spi.Integrator服务,但Hibernate 5没有详细记录它的用法

所以#1现在只能使用一个刺激因素:你需要手动将所有实体类放在persistence.xml中

我在这里看到两个问题:

  1. 据我所知,你有两个Web应用程序,一个依赖于另一个。 您应该将公共类和配置提取到新的Java库中,并将此库包含在Web应用程序中。
  2. 如果两个项目中的persistence.xml具有相同的单元名称可能会产生问题,那么您的单元名称会有所不同吗?