我正在努力完成我的家庭作业,其中我必须使用 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 类配置它们。
虽然我现在使用这个模板/示例:
最佳答案
使用 @PersistenceContext
将 EntityManager
bean 注入(inject)到您的 rest Controller 中。为了让它工作,你可以定义 LocalContainerEntityManagerFactoryBean
@Bean(name = "test")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
// configuration here
}
关于java - JPA EntityManager 注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34512454/