Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OneToMany?_Java_Spring_Hibernate - Fatal编程技术网

Java 如何使用OneToMany?

Java 如何使用OneToMany?,java,spring,hibernate,Java,Spring,Hibernate,我想链接2个实体: @Entity @Table(name = "company") public class Company { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(nullable = false, name = "company_name") private String companyName; @OneToMany(mappedBy = "company",

我想链接2个实体:

@Entity
@Table(name = "company")
public class Company {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Column(nullable = false, name = "company_name")
private String companyName;

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<Department> departments;

public Company(){
    departments = new ArrayList<Department>();
}

// setters and getters
}
DAO类:

@Service
public class CompanyDAOImpl implements CompanyDAO {

@Autowired
private SessionFactory sessionFactory;

@Override
public void createCompany(Company company) {
    sessionFactory.getCurrentSession().save(company);
}
}
服务级别:

@Service
public class CompanyServiceImpl implements CompanyService {

@Autowired
private CompanyDAO companyDAO;

@Override
@Transactional
public List readCompany() {
    return  companyDAO.readCompany();
}

@Override
@Transactional
public void createCompany(Company company) {
    companyDAO.createCompany(company);
}
}
当我要写入数据库时:

public class Main {
public static void main(String[] args) {

    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("spring.config.xml");
    CompanyService companyService = (CompanyService) ctx.getBean("companyServiceImpl");
    companyService.readCompany();
    Company company = new Company();
    company.setCompanyName("test1");
    companyService.createCompany(company);
}
}
我有很多例外:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'companyDAOImpl': Injection of autowired dependencies failed; nested
exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: 
private org.hibernate.SessionFactory com.itechart.dao.impl.CompanyDAOImpl.sessionFactory; nested
exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with
name 'sessionFactory' defined in class path resource [spring.config.xml]: Invocation of init
method failed; nested exception is java.lang.NoSuchMethodError:
javax.persistence.OneToMany.orphanRemoval()Z
所以我有2个配置xml文件。冬眠

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <mapping class="model.Company" />
    <mapping class="model.Department" />
</session-factory>
</hibernate-configuration>
public abstract class GenericDaoImpl<T, ID extends Serializable> {

private final Class<T> clazz;

@PersistenceContext(unitName = "persistenceUnit")
protected EntityManager entityManager;

protected GenericDaoImpl(Class<T> clazz) {
    this.clazz = clazz;
}

public List<T> all() {
    return entityManager.createQuery("FROM " + clazz.getName() + " a").getResultList();
}

@Transactional
public synchronized void delete(int id) {
    T entity = findById(id);
    entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

@Transactional
public synchronized void delete(T entity) {
    entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

public T findById(int id) {
    return entityManager.find(clazz, id);
}

@Transactional
public T findSingleResultOrNull(Query query) {
    query.setMaxResults(1);
    List data = query.getResultList();

    if (data.size() == 1) {
        return (T) data.get(0);
    } else {
        return null;
    }
}

@Transactional
public synchronized void save(T entity) {
    entityManager.persist(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

@Transactional
public synchronized void update(T entity) {
    entityManager.merge(entity);
}

protected EntityManager getEntityManager() {
    return entityManager;
}

protected void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

春天:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">

<context:component-scan base-package="dao.impl" />
<context:component-scan base-package="service.impl" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.config.xml</value>
    </property>
    <property name="packagesToScan" value="dao.impl"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/employee_service" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>

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

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

</beans>

类路径:hibernate.config.xml
我做错了什么?如何使用hibernate链接2个实体? pom.xml


http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>EmployeeService</groupId>
<artifactId>EmployeeService</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- Define Spring version as a constant -->
    <spring.version>3.2.0.RELEASE</spring.version>
</properties>

<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-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>

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

    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.2.2</version>
    </dependency>

    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.9.Final</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.31</version>
    </dependency>
</dependencies>

</project>
EmployeeService
雇员服务
1.0-快照
UTF-8
3.2.0.1发布
org.springframework
弹簧芯
${spring.version}
org.springframework
spring上下文
${spring.version}
org.springframework
德克萨斯州春季
${spring.version}
org.springframework
春季甲虫
${spring.version}
公共dbcp
公共dbcp
1.2.2
javax.persistence
持久性api
1
org.hibernate
冬眠核心
4.1.9.最终版本
mysql
mysql连接器java
5.1.31

以下错误表明您可能与jar版本存在冲突:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
属性需要JPA2.x。我猜您的部署中没有包含JPA2.x jar,或者您将其与一个旧的、冲突的版本一起包含


尝试将JPA 2.x jar添加到已部署应用程序的类路径中。对于Hibernate,jar的名称应该类似于
Hibernate-JPA-2.x-api-1.0.x.Final.jar
。同时确保没有包含旧版本。

我以前在使用Hibernate和Spring时遇到过这个问题,问题是当我尝试使用
ctx时.getBean(MyClass.class)
ctx.getBean(“MyClass”)
我会得到相同的错误。这是因为我的DAO类实现了一个接口,而这正是问题的根源

这是我的DAO类,我的其他DAO类从中继承

下面是我使用SpringMVC和Hibernate的设置

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <mapping class="model.Company" />
    <mapping class="model.Department" />
</session-factory>
</hibernate-configuration>
public abstract class GenericDaoImpl<T, ID extends Serializable> {

private final Class<T> clazz;

@PersistenceContext(unitName = "persistenceUnit")
protected EntityManager entityManager;

protected GenericDaoImpl(Class<T> clazz) {
    this.clazz = clazz;
}

public List<T> all() {
    return entityManager.createQuery("FROM " + clazz.getName() + " a").getResultList();
}

@Transactional
public synchronized void delete(int id) {
    T entity = findById(id);
    entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

@Transactional
public synchronized void delete(T entity) {
    entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

public T findById(int id) {
    return entityManager.find(clazz, id);
}

@Transactional
public T findSingleResultOrNull(Query query) {
    query.setMaxResults(1);
    List data = query.getResultList();

    if (data.size() == 1) {
        return (T) data.get(0);
    } else {
        return null;
    }
}

@Transactional
public synchronized void save(T entity) {
    entityManager.persist(entityManager.contains(entity) ? entity : entityManager.merge(entity));
}

@Transactional
public synchronized void update(T entity) {
    entityManager.merge(entity);
}

protected EntityManager getEntityManager() {
    return entityManager;
}

protected void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}
然后我有了我的Spring初始化器类

public class SpringUtil {

    private static final ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_config.xml");

    public static <T extends GenericDaoImpl> T newInstance(Class<T> clazz) {
        return (T) applicationContext.getBean(clazz);
    }
}
公共类SpringUtil{
私有静态最终类路径XmlApplicationContext applicationContext=新类路径XmlApplicationContext(“spring_config.xml”);
公共静态T newInstance(类clazz){
return(T)applicationContext.getBean(clazz);
}
}
然后我有了我的spring\u config.xml

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" autowire="byName"/>

<tx:annotation-driven />
<context:component-scan base-package="org.mycompany.system.dao" />

然后是我的persistence.xml

<persistence version="2.0" 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">
  <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.archive.autodetection" value="class"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.url" value="YOUR_DATABASE_CONNECTION_HERE"/>
      <property name="hibernate.connection.username" value="YOUR_USERNAME_HERE"/>
      <property name="hibernate.connection.password" value="YOUR_PASSWORD_HERE"/>
      <property name="hibernate.show_sql" value="false"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence

希望这对我添加到pom.xml依赖项时有所帮助:
org.hibernate.javax.persistence hibernate-jpa-2.1-api 1.0.0.Final
我也有同样的例外,这可能意味着还包括jpa 1.x jar(可能通过另一个依赖项传递)。请尝试删除
javax.persistence
/
persistence api
/
1.0
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" autowire="byName"/>

<tx:annotation-driven />
<context:component-scan base-package="org.mycompany.system.dao" />
<persistence version="2.0" 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">
  <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.archive.autodetection" value="class"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.url" value="YOUR_DATABASE_CONNECTION_HERE"/>
      <property name="hibernate.connection.username" value="YOUR_USERNAME_HERE"/>
      <property name="hibernate.connection.password" value="YOUR_PASSWORD_HERE"/>
      <property name="hibernate.show_sql" value="false"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>