簡體   English   中英

java - JPA EntityManager注入失敗

[英]java - JPA EntityManager Injection fails

我正在努力完成我的作業,我必須用Spring構建一個Restful Webservice。 另外我使用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-Class配置它們。

雖然我現在使用這個模板/示例:

彈簧啟動的mysql-springdatajpa冬眠

使用@PersistenceContext您將EntityManager bean注入到其余控制器中。 要使其工作,您可以定義LocalContainerEntityManagerFactoryBean

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

在你的applicationContext中定義:

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



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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM