首页 文章

JPA,MySQL,Hibernate和Maven Skeleton

提问于
浏览
1

我一直在尝试使用JPA,MySQL,Hibernate和Maven来运行(并提交到DB)一个简单的骨架应用程序,但是我遇到了问题 .

下面列出了我的2个普通类,我的pom.xml和我的META-INF / persistence.xml

我可以毫无问题地构建项目(mvn clean install),但运行它(mvn exec:java -Dexec.mainClass = com.foo.HelloWorld -X)会导致异常,使用以下StackTrace .

任何帮助将不胜感激!

堆栈跟踪:

org.apache.maven.lifecycle.LifecycleExecutionException: An exception occured while executing the Java class. null
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. null
        at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:346)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        ... 17 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:291)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchMethodError: org.hibernate.event.PreInsertEvent.getSource()Lorg/hibernate/engine/SessionImplementor;
        at org.hibernate.validator.event.ValidateEventListener.onPreInsert(ValidateEventListener.java:167)
        at org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:142)
        at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
        at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:154)
        at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:110)
        at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
        at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:646)
        at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:620)
        at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:624)
        at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:212)
        at com.foo.HelloWorld.create(HelloWorld.java:32)
        at com.foo.HelloWorld.main(HelloWorld.java:11)
        ... 6 more

我有以下两个类:要存储的实体 .

package com.foo;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Message {
    @Id
    @GeneratedValue
    private int id;
    @Basic
    private String message;

    public Message() {}

    public Message(String message) {
        this.message = message;
    }

    public String toString() {
        return "Greeting id=" + id + ", message=" + message;
    }
}

应用程序:

package com.foo;

public class HelloWorld {
    private javax.persistence.EntityManagerFactory emf;
    private javax.persistence.EntityManager em;
    private String PERSISTENCE_UNIT_NAME = "hello-world";

    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld();
        hello.initEntityManager();
        hello.create();
        //        hello.read();
        hello.closeEntityManager();
    }

    private void initEntityManager() {
        emf = javax.persistence.Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        em = emf.createEntityManager();
    }

    private void closeEntityManager() {
        em.close();
        emf.close();
    }

    private void create() {
        em.getTransaction().begin();
        Message hello = new Message("hello world");
        Message bye = new Message("goodbye, world");
        Message[] messages = new Message[] {hello, bye};
        for (Message m : messages) {
            em.persist(m);
        }
        em.getTransaction().commit();
    }

    //    private void read() {
    //        Message m = (Message)em.createQuery("select m from Message m").getSingleResult();
    //        System.out.println("Query returned: " + m);
    //    }
}

以下是我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 <modelVersion>4.0.0</modelVersion>
 <groupId>com.treocht.hibernate.tutorial</groupId>
 <artifactId>hibernate-tutorial</artifactId>
 <version>1.0.0-SNAPSHOT</version>
 <name>First Hibernate Tutorial</name>


 <dependencies>

  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>3.3.2.GA</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>javax.persistence</groupId>
   <artifactId>persistence-api</artifactId>
   <version>1.0</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>

  <dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.0.4</version>
  </dependency>

  <dependency>
   <groupId>hsqldb</groupId>
   <artifactId>hsqldb</artifactId>
   <version>1.8.0.7</version>
  </dependency>

  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate</artifactId>
   <version>3.2.2.ga</version>
  </dependency>

  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-annotations</artifactId>
   <version>3.2.1.ga</version>
  </dependency>

  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-entitymanager</artifactId>
   <version>3.2.1.ga</version>
  </dependency>

  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-tools</artifactId>
   <version>3.2.0.beta9a</version>
  </dependency>

  <dependency>
   <groupId>c3p0</groupId>
   <artifactId>c3p0</artifactId>
   <version>0.9.1</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.6.1</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.13</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>
 </dependencies>

 <build>
  <!--
   we dont want the version to be part of the generated war file name
  -->
  <finalName>${artifactId}</finalName>

  <pluginManagement>
   <plugins>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
      <source>1.6</source>
      <target>1.6</target>
     </configuration>
    </plugin>
   </plugins>
  </pluginManagement>
 </build>

</project>

我有这个META-INF / 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 persistence_1_0.xsd"
 version="1.0">

 <persistence-unit name="hello-world" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <class>com.foo.Message</class>
  <properties>
   <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/my_db" />
   <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
   <property name="hibernate.connection.password" value="password" />
   <property name="hibernate.connection.username" value="username" />
   <property name="hibernate.hbm2ddl.auto" value="update" />
  </properties>
 </persistence-unit>
</persistence>

3 回答

  • 1

    您确实使用了不兼容的Hibernate工件版本,因为这可以使用 official Hibernate Compatibility Matrix进行验证 . 不要依赖网上发现的一些随机教程 .

    但是,由于您需要声明所有Hibernate工件,因此只需利用传递依赖项 . 所以 justhibernate-entitymanager 中声明了一个依赖项(特别是如果你're not sure of what you'这样做):

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.4.0.GA</version><!-- for JPA 1.0 -->
    </dependency>
    

    并删除这些 hibernatehibernate-corehibernate-annotationspersistence-apislf4j 依赖项 .

    如果要更改传递的 sfl4j-api 工件的版本,则应在依赖关系管理部分中执行此操作:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.6.1</version>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    实际上(我很遗憾地说)你的整个pom是一团糟,试着花一些时间来清理它 . 使用 mvn dependency:tree (或IDE提供的一些视觉前端)来执行此操作 .

    并且让我坚持,不要依赖于网上发现的一些随机(和错误)教程,利用Maven传递依赖机制 .

    PS:从Hibernate 3.5开始,各种项目(Hibernate Annotation,Hibernate EntityManager)已经合并回Hibernate Core并且它们的版本是同步的,这简化了很多版本管理,即使对于Maven用户也是如此 .

  • 1

    版本中可能存在冲突 . compare it with this

  • 2

    现在这个工作了,我的pom.xml看起来像这样:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.company.hibernate.tutorial</groupId>
        <artifactId>hibernate-tutorial</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>Hibernate Tutorial</name>
    
         <repositories>
            <repository>
              <id>JBoss repository</id>
              <url>http://repository.jboss.com/maven2/</url>
            </repository>
          </repositories>
    
        <dependencies>
    
            <!-- Hibernate framework -->
            <dependency>
              <groupId>org.hibernate</groupId>
              <artifactId>hibernate-entitymanager</artifactId>
              <version>3.4.0.GA</version><!-- for JPA 1.0 -->
    
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.13</version>
                <type>jar</type>
            </dependency>
    
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-jdk14</artifactId>
                <version>1.6.1</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <version>1.6.1</version>
                    <type>jar</type>
                    <scope>compile</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    

相关问题