java - 使用 EntityManagerFactory 时遇到问题

标签 java spring jpa

我正在尝试弄清楚如何使用 @PersistenceUnit,因为我读到它是比 @PersistenceContext 更好的解决方案。问题是......我不知道如何让它正常工作......

@Controller
public class Content {
    @PersistenceUnit(unitName = "CMTPU")
    public EntityManagerFactory emf;
    public EntityManager em = emf.createEntityManager();

    @RequestMapping(value={"/content/edit*"}, method=RequestMethod.GET)
    public ModelAndView edit(Model model) {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("content/edit");

        //get symbols
        List<Symbol> symbols = em.createNamedQuery("Symbol.findAll").getResultList();
        mv.addObject(symbols);

        return mv;
    }
}

我的应用程序在添加 //get Symbols 部分和 EntityManager 内容之前加载。现在我看到错误 SEVERE: 加载应用程序时出现异常: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang。空指针异常

我读到我需要定义一个 unitName,但随后我正在查看 this documentation而且它并没有表明已经完成。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
  <persistence-unit name="CMTPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>CMT_DEV</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

我无法确定自己做错了什么。

更新

我的模型定义了数据库和所有内容,如下所示。我还需要 persistence.xml 吗?

package com.fettergroup.cmt.models;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


    @Entity
    @Table(name = "symbol", catalog = "DATABASE1", schema = "dbo")
    @NamedQueries({
        @NamedQuery(name = "Symbol.findAll", query = "SELECT s FROM Symbol s"),
        @NamedQuery(name = "Symbol.findById", query = "SELECT s FROM Symbol s WHERE s.id = :id"),
        @NamedQuery(name = "Symbol.findBySymbol", query = "SELECT s FROM Symbol s WHERE s.symbol = :symbol"),
        @NamedQuery(name = "Symbol.findByHtmlNumber", query = "SELECT s FROM Symbol s WHERE s.htmlNumber = :htmlNumber"),
        @NamedQuery(name = "Symbol.findByHtmlName", query = "SELECT s FROM Symbol s WHERE s.htmlName = :htmlName"),
        @NamedQuery(name = "Symbol.findByAsciiDec", query = "SELECT s FROM Symbol s WHERE s.asciiDec = :asciiDec"),
        @NamedQuery(name = "Symbol.findByAsciiHex", query = "SELECT s FROM Symbol s WHERE s.asciiHex = :asciiHex")})
    public class Symbol implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @NotNull
        @Column(name = "id")
        private Short id;
        @Size(max = 10)
        @Column(name = "symbol")
        private String symbol;
        @Size(max = 10)
        @Column(name = "html_number")
        private String htmlNumber;
        @Size(max = 10)
        @Column(name = "html_name")
        private String htmlName;
        @Size(max = 10)
        @Column(name = "ascii_dec")
        private String asciiDec;
        @Size(max = 10)
        @Column(name = "ascii_hex")
        private String asciiHex;

        public Symbol() {
        }

        public Symbol(Short id) {
            this.id = id;
        }

        public Short getId() {
            return id;
        }

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

        public String getSymbol() {
            return symbol;
        }

        public void setSymbol(String symbol) {
            this.symbol = symbol;
        }

        public String getHtmlNumber() {
            return htmlNumber;
        }

        public void setHtmlNumber(String htmlNumber) {
            this.htmlNumber = htmlNumber;
        }

        public String getHtmlName() {
            return htmlName;
        }

        public void setHtmlName(String htmlName) {
            this.htmlName = htmlName;
        }

        public String getAsciiDec() {
            return asciiDec;
        }

        public void setAsciiDec(String asciiDec) {
            this.asciiDec = asciiDec;
        }

        public String getAsciiHex() {
            return asciiHex;
        }

        public void setAsciiHex(String asciiHex) {
            this.asciiHex = asciiHex;
        }

        @Override
        public int hashCode() {
            int hash = 0;
            hash += (id != null ? id.hashCode() : 0);
            return hash;
        }

        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Symbol)) {
                return false;
            }
            Symbol other = (Symbol) object;
            if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
            }
            return true;
        }

        @Override
        public String toString() {
            return "com.project1.models.Symbol[ id=" + id + " ]";
        }

    }

最佳答案

仅使用

@Controller
public class Content {

   @PersistenceContext(unitName = "CMTPU")
   public EntityManager em;

实体管理器应该由spring控制。

这是一个示例,它使用 hiberante 作为持久性提供程序,但我认为您可以调整它。

<tx:annotation-driven transaction-manager="transactionManager" />

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

</bean>
<bean
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactory">
    <property name="persistenceUnitName" value="myPersistenceUnit" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
        </bean>
    </property>
</bean>

适用于该配置的示例持久性单元

<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.connection.charSet" value="UTF-8" />
    </properties>
</persistence-unit>

关于java - 使用 EntityManagerFactory 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736704/

相关文章:

java - 在 JPA 中保存列表的顺序

java - 使用 hibernate 根据 '123%' 获取 sql 结果

Java - 如何从另一个方法访问方法范围内的 ArrayList?

java - Spring RESTful Controller 方法改进建议

spring - HTTP 状态 500 - 处理程序处理失败;嵌套异常是 java.lang.NoSuchMethodError :

java - 什么是 NoSuchBeanDefinitionException 以及如何修复它?

java - 使用 @ManyToMany 关联连接三个表

java - 创建函数流的更好方法?

java - Blackberry:OS 5.0 上的 BrowserField2 API 滚动问题

Java链表问题