java - JPA EntityManager 注入(inject)失败

标签 java spring hibernate jpa

我正在努力完成我的家庭作业,其中我必须使用 Spring 构建一个 Restful Web 服务。此外,我还使用 JPA (Eclipselink) 来编辑、搜索和显示数据库条目。

我的persistence.xml如下;

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="test">
        <class>at.test.entities.UserEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://myserver:3306/somedatabase"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="xxx"/>
            <property name="javax.persistence.jdbc.password" value="xxx"/>
        </properties>
    </persistence-unit>
</persistence>

当我尝试通过

获取实体管理器时
entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();

它工作得很好,但如果我想通过 @PersistenceContext 注释来完成它

@PersistenceContext(unitName = "test")
private EntityManager entityManager;

失败并显示以下堆栈跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestHandler': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test' is defined

工作原理:

@RestController
@RequestMapping(value = "/users")
public class RequestHandler {
    private EntityManager entityManager;

    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<UserTest> test(@RequestParam(value = "asd", defaultValue = "") String name) {
        /* works just fine */
        entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();

        /* Some test stuff */
        UserTest user = entityManager.find(UserTest.class, 1);
        entityManager.getTransaction().begin();
        entityManager.persist(new UserTest("ASDASD", "ASDASdjnwco2eno2oc"));
        entityManager.getTransaction().commit();
        return new ResponseEntity<UserTest>(user, HttpStatus.CREATED);
    }
}

它为什么不起作用:

@RestController
@RequestMapping(value = "/users")
public class RequestHandler {
    /* Does not work */
    @PersistenceContext(unitName = "test")
    private EntityManager entityManager;

    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<UserTest> test(@RequestParam(value = "asd", defaultValue = "") String name) {
        /* Some test stuff */
        UserTest user = entityManager.find(UserTest.class, 1);
        entityManager.getTransaction().begin();
        entityManager.persist(new UserTest("ASDASD", "ASDASdjnwco2eno2oc"));
        entityManager.getTransaction().commit();
        return new ResponseEntity<UserTest>(user, HttpStatus.CREATED);
    }
}

谢谢你的帮助

解决方案

AdrianDuta 和 Branislav Lazic 的两种解决方案都有效。您可以通过 XML 文件定义 bean 和持久性单元,也可以根据 Java 类配置它们。

虽然我现在使用这个模板/示例:

spring-boot-mysql-springdatajpa-hibernate

最佳答案

使用 @PersistenceContextEntityManager bean 注入(inject)到您的 rest Controller 中。为了让它工作,你可以定义 LocalContainerEntityManagerFactoryBean

@Bean(name = "test")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        // configuration here
}

关于java - JPA EntityManager 注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34512454/

相关文章:

java - Spring MVC + Hibernate + JSP

mysql - 如何进行删除查询?

java - 在路径中使用通配符执行 Jar

Java,悬停组件时显示帮助标签

java - 具有多个关联的 Hibernate 提取

java - 使用 Spring Data JPA 时是否可以在其中包含 "by"的字段名称?

java - Apache DBCP2 连接池在 Tomcat 启动时打开比 maxTotal 更多的 MYSQL 连接

java - 如何在Java中拆分字符串并将其存储在不同的列表中

spring - 如何使用spring boot maven插件生成可执行脚本

java - Hibernate 继承和二级缓存代理