JPA, MySQL, Hibernate & Maven Skeleton - PullRequest
       5

JPA, MySQL, Hibernate & Maven Skeleton

1 голос
/ 09 августа 2010

Я пытался заставить простое скелетное приложение работать (и фиксировать в БД) с использованием JPA, MySQL, Hibernate & Maven, однако у меня возникли проблемы.

Ниже перечислены мои 2тривиальные классы, мой pom.xml и мой META-INF / persistence.xml

Я могу построить проект без каких-либо проблем (чистая установка mvn), однако запустить его (mvn exec: java -Dexec.mainClass =com.foo.HelloWorld -X) вызывает исключение со следующим StackTrace.

Любая помощь будет принята с благодарностью!

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

У меня естьследующие два класса: Entity для хранения.

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 ]

2 голосов
/ 09 августа 2010

Вы действительно используете несовместимые версии артефактов Hibernate, поскольку это можно проверить с помощью официальной матрицы совместимости Hibernate .Не полагайтесь на какое-то случайное учебное пособие, найденное в сети.

Но поскольку вы используете Maven, вам фактически не нужно объявлять все артефакты Hibernate, просто используйте транзитивные зависимости.Поэтому просто объявляет зависимость в hibernate-entitymanager (особенно если вы не уверены в том, что делаете):

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

И удалите эти hibernate, hibernate-core, hibernate-annotations, persistence-api, slf4j зависимости.

И если вы хотите изменить версию артефакта sfl4j-api, который вы получаете транзитивно, вы должны сделать это в разделе управления зависимостями:

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

На самом деле (и яизвините, чтобы сказать так) вся ваша помада в большом беспорядке, попробуйте потратить некоторое время на ее очистку.Для этого используйте mvn dependency:tree (или какой-либо визуальный интерфейс, предлагаемый вашей IDE).

И позвольте мне настаивать, не полагайтесь на какое-то случайное (и неправильное) учебное пособие, найденное в сети, используйте транзитивную зависимость Mavenмеханизм.

PS: Начиная с Hibernate 3.5, различные проекты (Hibernate Annotation, Hibernate EntityManager) были объединены обратно в Hibernate Core, и их версии синхронизированы, что значительно упрощает управление версиями, даже для пользователей Maven.

1 голос
/ 09 августа 2010

Это сейчас работает, и мой 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>


1 голос
/ 09 августа 2010

В версии могут быть конфликты. сравните с этим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...