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