Unable to call Hibernate/QueryDSL from another maven subproject

旧巷老猫 提交于 2019-12-20 05:10:52

问题


I have two maven sub-projects - jetty_runner1 and jetty_runner2

My directory structure looks like the following:

./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 and web.xml are exactly the same in the two projects, except for package names (I have created this simplified example for posting here. In the actual application, the two sub-projects do wildly different things)

Here are the actual file contents:

CheckPersistence.java

public class CheckPersistence
{
    public void beginUpdation()
    {
        String val = null;
        List<MiscKeyValue> 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<MiscKeyValue> selectStar()
    {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        JPAQuery query = new JPAQuery(em);
        List<MiscKeyValue> 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

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="world">
      <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
      <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/world"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="password"/>
        <property name="hibernate.format_sql" value="true"/>
      </properties>
    </persistence-unit>
</persistence>

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
   version="2.5"
   metadata-complete="true">
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.jetty_runner1.HelloWorldServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>
</web-app>

Each pom.xml contains the QueryDSL and Jetty plugin too:

<build>
  <plugins>
   <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>${jettyVersion}</version>
    </plugin>
    <plugin>
      <groupId>com.mysema.maven</groupId>
      <artifactId>apt-maven-plugin</artifactId>
      <version>1.1.3</version>
      <executions>
        <execution>
          <goals>
            <goal>process</goal>
          </goals>
          <configuration>
            <outputDirectory>target/generated-sources/java</outputDirectory>
            <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
          </configuration>
        </execution>
      </executions>
      <dependencies>
        <dependency>
          <groupId>com.mysema.querydsl</groupId>
          <artifactId>querydsl-apt</artifactId>
          <version>${querydsl.version}</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

When I run mvn jetty:run from jetty_runner1 and hit the URL localhost:8080/hello/ , everything works fine, in the sense query executes and updates.

When I run the same from jetty_runner2 and hit the same URL, it gives an exception saying:

org.hibernate.hql.internal.ast.QuerySyntaxException: Misc_Key_Value is not mapped [select miscKeyValue from Misc_Key_Value miscKeyValue fetch all properties]

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.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(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:


So after some more searching, I found two solutions:

1) Add your-entity-class to your persistence.xml

2) Use org.hibernate.integrator.spi.Integrator service but it's usage is not well documented for Hibernate 5

So #1 works for now with one irritant: You need to manually put all your entity classes in the persistence.xml




回答2:


I see here two problems:

  1. AS far as I understood, you have two web application, and one depends on another. You should extract common classes and configuration into new java library and include this library into your web applications.
  2. If your persistence.xml in both project has the same unit-name it can make problems, your unit-name are different?


来源:https://stackoverflow.com/questions/32857422/unable-to-call-hibernate-querydsl-from-another-maven-subproject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!