0

我到处搜索,但没有找到好的答案。
我正在使用 Hibernate + Spring + Mysql 开发一个 Maven 应用程序。
这是我的 application-context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http:...">

<bean id='dataSource' class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/university"/>
    <property name="username" value="root"/>
    <property name="password" value="admin"/>
</bean>

<bean id='sessionFactory' class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="annotatedClasses">
        <list>
            <value>com.university.entities.Course</value>
            <value>com.university.entities.Student</value>
            <value>com.university.entities.Teacher</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
        </props>
    </property>
</bean>

<bean id='transactionManager' class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref='sessionFactory'/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<context:annotation-config/>

<context:component-scan base-package="com.university.dao"></context:component-scan>
</beans>

这是我的 pom.xml :

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.2.4.RELEASE</spring.version>
    <hibernate.version>3.6.7.Final</hibernate.version>
    <jsf.version>2.2.4</jsf.version>
    <slf4j.version>1.7.1</slf4j.version>
    <primefaces.version>4.0</primefaces.version>
</properties>


<dependencies>

    <!-- Tests unitaires avec junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

    <!-- Spring 3 dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- antlr -->
    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>3.5.1</version>
    </dependency>

    <!-- Package entities -->
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0-rev-1</version>
        <scope>provided</scope>
    </dependency>

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.2.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
        <scope>runtime</scope>
    </dependency>

    <!-- JSF dependencies -->
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>${jsf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>${jsf.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- Primefaces dependency -->
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>${primefaces.version}</version>
    </dependency>

    <!-- slf4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>


    <!-- commons -->
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>commons-pool</groupId>
        <artifactId>commons-pool</artifactId>
        <version>1.5.4</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.3</version>
    </dependency>

    <!-- log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
    </dependency>

    <!-- javassist -->
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>

    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.16</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

但是当我尝试将一个简单的 DAO 测试为:

package com.university.dao.test;
import java.util.List;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.university.dao.StudentDAO;
import com.university.entities.Student;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context.xml" })

public class StudentDAOTest extends TestCase {

private static Log LOG = LogFactory.getLog(StudentDAOTest.class);

@Autowired
private StudentDAO studentDAO;

@Test
public void testFindAll() {
    List<Student> listStudent = studentDAO.findAll();
    LOG.debug(listStudent);
    assertNotNull(listStudent);
}

@Test
public void testCreateOrUpdate() {
    Student newStudent = new Student("Abderrahmen ISSA", "07701607");
    studentDAO.createOrUpdate(newStudent);
    assertNotNull(newStudent.getId());
}

@Test
public void testFindById() {
    Integer id = 2;
    Student student = studentDAO.findById(id);
    assertNotNull(student);
}

@Test
public void testRemove() {
    Student userToRemove = new Student("User To Test Remove", "11111111");
    studentDAO.createOrUpdate(userToRemove);
    Integer id = userToRemove.getId();

    studentDAO.remove(userToRemove);
    Student student = studentDAO.findById(id);
    assertNull(student);
    }

}

学生班是:

package com.university.entities;
// Generated 20 oct. 2013 20:53:03 by Hibernate Tools 3.4.0.CR1
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
 * Student generated by hbm2java
 */

@Entity
@Table(name = "student", catalog = "university")
public class Student implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String mail;
private Date birthDate;
private String birthPlace;
private String cin;
private Integer mobile;
private Set<Course> courses = new HashSet<Course>(0);

public Student() {
}

public Student(String mail, String cin) {
    this.mail = mail;
    this.cin = cin;
}

public Student(String name, String mail, Date birthDate, String birthPlace,
        String cin, Integer mobile, Set<Course> courses) {
    this.name = name;
    this.mail = mail;
    this.birthDate = birthDate;
    this.birthPlace = birthPlace;
    this.cin = cin;
    this.mobile = mobile;
    this.courses = courses;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
    return this.id;
}

public void setId(Integer id) {
    this.id = id;
}

@Column(name = "name", length = 45)
public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name = "mail", nullable = false, length = 45)
public String getMail() {
    return this.mail;
}

public void setMail(String mail) {
    this.mail = mail;
}

@Temporal(TemporalType.DATE)
@Column(name = "birthDate", length = 10)
public Date getBirthDate() {
    return this.birthDate;
}

public void setBirthDate(Date birthDate) {
    this.birthDate = birthDate;
}

@Column(name = "birthPlace", length = 45)
public String getBirthPlace() {
    return this.birthPlace;
}

public void setBirthPlace(String birthPlace) {
    this.birthPlace = birthPlace;
}

@Column(name = "cin", nullable = false, length = 45)
public String getCin() {
    return this.cin;
}

public void setCin(String cin) {
    this.cin = cin;
}

@Column(name = "mobile")
public Integer getMobile() {
    return this.mobile;
}

public void setMobile(Integer mobile) {
    this.mobile = mobile;
}

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "course_has_student", catalog = "university", joinColumns = { @JoinColumn(name = "Student_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "Course_id", nullable = false, updatable = false) })
public Set<Course> getCourses() {
    return this.courses;
}

public void setCourses(Set<Course> courses) {
    this.courses = courses;
}

@Override
public String toString() {
    return "Student [name=" + name + ", mail=" + mail + ", cin=" + cin
            + "]";
}
}

StudentDAOImpl :

package com.university.dao.impl;
import org.springframework.stereotype.Repository;
import com.university.dao.StudentDAO;
import com.university.entities.Student;

@Repository("studentDAO")
public class StudentDAOImpl extends GenericDAOImpl<Student> implements
    StudentDAO {
}

GenericDAOImpl :

package com.university.dao.impl;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.university.dao.GenericDAO;

@Transactional
public abstract class GenericDAOImpl<T> implements GenericDAO<T> {

@Autowired
protected SessionFactory sessionFactory;

/**
 * Unit.
 */
private final Class<T> entityBeanType;

/**
 * Instantiates a new GenericServiceImpl.
 */
@SuppressWarnings("unchecked")
public GenericDAOImpl() {
    this.entityBeanType = (Class<T>) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
}

public SessionFactory getSessionFactory() {
    return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

protected final Session getCurrentSession() {
    if (sessionFactory == null) {
        throw new IllegalStateException(
                "Session Factory has not been set on DAO before usage");
    }
    return sessionFactory.getCurrentSession();
}

/**
 * Gets the entity bean type.
 * 
 * @return the entity bean type
 */
public final Class<T> getEntityBeanType() {
    return entityBeanType;
}

public void createOrUpdate(T entity) {
    getCurrentSession().saveOrUpdate(entity);
}

@SuppressWarnings("unchecked")
public List<T> findAll() {
    return getCurrentSession().createQuery(
            "from " + getEntityBeanType().getName()).list();
}

@SuppressWarnings("unchecked")
public T findById(Integer id) {
    T entity = (T) getCurrentSession().get(getEntityBeanType(), id);
    return entity;
}

public void remove(T entity) {
    getCurrentSession().delete(entity);
}
}

我可以很好地在 Eclipse 上运行 DAOTest,但使用 mvn test 我得到:

org.springframework.beans.factory.BeanCreationEception:在类路径资源 [application-context.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.NoSuchMethodError : javax.persistence.OneToMany.orphanRemoval<>Z。

请帮忙 !

4

1 回答 1

1

你有图书馆冲突。您是否将其设置为 Eclipse 中的 Hibernate 项目,以便 Eclipse 将必要的 JAR 添加到类路径中?这可以解释为什么它在 Eclipse 中有效,但在 Maven 构建中无效。

无论如何,确保 Hibernate 库版本匹配例如 4.1.8.Final 并删除 javax.persistence-api 依赖项。

这就是你在 POM 中需要的关于 Hibernate 的全部内容。其他一切都将由 Maven 传递解决。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>${hibernate.version}</version>
</dependency>
于 2013-11-13T20:34:21.637 回答