gpt4 book ai didi

java - 无法使用 spring 管理的 EntityManager 持久保存数据

转载 作者:行者123 更新时间:2023-12-02 13:16:28 25 4
gpt4 key购买 nike

我再次需要你的帮助,我正在尝试将 Hibernate + Spring 集成到我的独立 java 应用程序中,但数据库操作无法正常工作,但是注入(inject)了实体管理器,我通过调试验证了这一点,所以我不确定其中缺少什么我的代码/配置,我通过谷歌搜索做了一些研究,但没有找到解决我的问题的东西。因此,我发布我的代码/配置,以便有人可以帮助我摆脱困境。

实体类:

      package com.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "employee")
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMP_ID")
private Integer empoyeeId;

@Column(name = "EMP_NAME")
private String employeeName;

public Integer getEmpoyeeId() {
return this.empoyeeId;
}

public void setEmpoyeeId(Integer empoyeeId) {
this.empoyeeId = empoyeeId;
}

public String getEmployeeName() {
return this.employeeName;
}

public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
}

dao 类

  package com.dao.impl;

import javax.persistence.EntityManager;

import com.dao.IEmployeeDao;
import com.entity.Employee;

public class EmployeeDao implements IEmployeeDao {

private static final Logger LOGGER =
LogManager.getLogger(EmployeeDao.class);

@PersistenceContext(unitName = "testPU")
private EntityManager em;

@Override
public Employee create(Employee aEmployee) {
return this.em.merge(aEmployee);
}

@Override
public Employee fetchEmployeeById(Integer aEmployeeId) {
return this.em.find(Employee.class, aEmployeeId);
}
}

主类:

    package com.client;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dao.IEmployeeDao;
import com.entity.Employee;

public class Client {
private static final Logger LOGGER = LogManager.getLogger(Client.class);

public static void main(String[] args) throws BeansException,
Exception {
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationcontext.xml");
LOGGER.info("client invoked");
IEmployeeDao employeeDao =
(IEmployeeDao)applicationContext.getBean("employeeDao");
Employee employee = new Employee();
employee.setEmployeeName("Suraj Kumar");
employee = employeeDao.create(employee);
employee =
employeeDao.fetchEmployeeById(employee.getEmpoyeeId());
//getting null pointer here as employee is null

// EntityManagerFactory emf =
Persistence.createEntityManagerFactory("testPU");
// EntityManager em = emf.createEntityManager();
// em.getTransaction().begin();
// EmployeeDao employeeDao = new EmployeeDao();
// employeeDao.setEm(em);
// Employee employee = new Employee();
// employee.setEmployeeName("Suraj Kumar");
// employee = employeeDao.create(employee);
// employee =
employeeDao.fetchEmployeeById(employee.getEmpoyeeId());
// em.getTransaction().commit();
// em.close();
// emf.close();
}
}

使用上面的客户端代码,当我尝试通过 id 获取员工时,出现空指针异常,因为调用 create 返回的员工返回 null,这表明该记录未持久化。

然而,当我通过注释上面未注释的代码并取消注释现在注释的代码来关闭 spring 时,即当我只使用 hibernate 而不使用 spring 时,一切正常。我在下面提供了配置文件。

applicationcontext.xml:

    <?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">
<import resource="aspects.xml"/>

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

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

<bean id="employeeDao" class="com.dao.impl.EmployeeDao" />

</beans>

持久性.xml

   <?xml version="1.0" encoding="UTF-8"?>
<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="testPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.entity.Employee</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/dbname"/>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver"/>

<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.username" value="user"/>
<property name="hibernate.connection.password" value="password"/>
<property name="hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

我也在使用方面,但我还没有发布代码,因为我不确定它是否相关,因为我尝试关闭方面,即使我面临这个问题,只是在关闭方面时发生了一件奇怪的事情获取空指针异常时,我从 EntityManager 类的 find 方法内部得到另一个异常,这表明在这种情况下,dao 类的 create 方法不返回 null。

有人可以帮我吗?

最佳答案

您的交易似乎尚未提交。

尝试将 @Transactional 添加到 EmployeeDao 类中的方法,或者更好的是,创建一个服务层来处理事务并使用 @Transactional 注释其方法

关于java - 无法使用 spring 管理的 EntityManager 持久保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43744735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com