簡體   English   中英

實體管理器NULL-Spring MVC JPA

[英]Entity Manager NULL - Spring MVC JPA

在以下代碼中, entityManager為null。 我究竟做錯了什么? 我需要將entityManager自動注入。

我的對象模型:

@Entity
@Table(name = "jlocalidades", catalog = "7jogos")
public class Jlocalidades implements java.io.Serializable {

    private Integer id;
    private String nome;
    private String descricao;

    public Jlocalidades() {
    }

    public Jlocalidades(String nome, String descricao) {
        this.nome = nome;
        this.descricao = descricao;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "Id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "Nome", nullable = false, length = 200)
    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name = "Descricao", nullable = false, length = 200)
    public String getDescricao() {
        return this.descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    }

我的Servlet

    <?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:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/jee   http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
    http://www.springframework.org/schema/tx   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    ">


    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->

<context:component-scan base-package="com.dtr.oas" />
 <context:annotation-config/>



        <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
   <!--     <resources mapping="/resources/**" location="/resources/" /> -->

      <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>



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

    <bean id="mysqlDS"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://192.168.254.38:3306/7jogos" />
        <property name="username" value="root" />
        <property name="password" value="6+1Log.pt" />
    </bean>

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="mysqlDS"/>
      <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
    </bean>

        <tx:annotation-driven/>

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

</beans>    

我的堅持

<?xml version="1.0" encoding="UTF-8" ?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <!-- shouldn't be valid for java SE per specification, but it works for EclipseLink ... -->
    <class>com.dtr.oas.model.Jlocalidades</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>

        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.254.38:3306/7jogos" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="6+1Log.pt" />

        <!-- EclipseLink should create the database schema automatically -->
        <property name="eclipselink.ddl-generation" value="create-tables" />
        <property name="eclipselink.ddl-generation.output-mode" value="database" />
        <property name="eclipselink.logging.level" value="SEVERE"/>                
    </properties>

</persistence-unit>

我的控制器出現錯誤

     package com.dtr.oas.model;



import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.setelog.model.Jcelulas;



public class JlocalidadesHome implements IJlocalidadesHome {

private static final Log log = LogFactory.getLog(JlocalidadesHome.class);


@Autowired
 private SessionFactory sessionFactory;

 private Session getCurrentSession() {
  return sessionFactory.getCurrentSession();
 }


@PersistenceContext
private EntityManager entityManager;

public void persist(Jlocalidades transientInstance) {
    log.debug("persisting Jlocalidades instance");
    try {

        EntityManager entityManager = Persistence.createEntityManagerFactory("persistenceUnit").createEntityManager();
        entityManager.persist(transientInstance);
        log.debug("persist successful");
    } catch (RuntimeException re) {
        log.error("persist failed", re);
        throw re;
    }
}

public void remove(Jlocalidades persistentInstance) {
    log.debug("removing Jlocalidades instance");
    try {
        entityManager.remove(persistentInstance);
        log.debug("remove successful");
    } catch (RuntimeException re) {
        log.error("remove failed", re);
        throw re;
    }
}

public Jlocalidades merge(Jlocalidades detachedInstance) {
    log.debug("merging Jlocalidades instance");
    try {
        Jlocalidades result = entityManager.merge(detachedInstance);
        log.debug("merge successful");
        return result;
    } catch (RuntimeException re) {
        log.error("merge failed", re);
        throw re;
    }
}

public Jlocalidades findById(Integer id) {
    log.debug("getting Jlocalidades instance with id: " + id);
    try {
        Jlocalidades instance = entityManager.find(Jlocalidades.class, id);
        log.debug("get successful");
        return instance;
    } catch (RuntimeException re) {
        log.error("get failed", re);
        throw re;
    }
}

@Transactional
public List<Jlocalidades> All (){
    log.debug("getting all Jlocalidades");
    try {

        List<Jlocalidades> instance = entityManager.createQuery("SELECT * FROM jlocalidades").getResultList(); 
        log.debug("get successful");
        return instance;
    } catch (RuntimeException re) {
        log.error("get failed", re);
        throw re;
    }
   }
}

您需要在控制器類上使用@Controller ,以便Spring可以將entityManager注入其中。 由於您希望Spring注入EntityManager,所以不要這樣做:

EntityManager entityManager = Persistence.createEntityManagerFactory("persistenceUnit").createEntityManager();

通常,僅在沒有容器的情況下運行時才調用Persistence.createEntityManagerFactory()

Bootstrap類,用於在Java SE環境中獲取EntityManagerFactory

您可以通過更改EntityManager配置而無需persistence.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mysqlDS"/>
    <property name="packagesToScan" value="YOUR.ENTITY.PKG" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="generatedDdl" value="true" />
            <property name="databasePlatform" value="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </bean>
    </property>
</bean>

控制器如何實例化? 它需要是一個彈簧管理的bean。

您已經在conf文件中定義了類路徑掃描xml。 但是JlocalidadesHome並未使用Controller / Component進行注釋。

順便說一句,使用控制器從請求中獲取輸入,然后它應該調用服務類...並且服務類與數據層類進行交互

暫無
暫無

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

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