2012-03-16 5 views
0

J'essaie de comprendre comment utiliser @PersistenceUnit car j'ai lu que c'est une bien meilleure solution que @PersistenceContext. Le problème est .... Je ne peux pas comprendre comment le faire fonctionner correctement ...Problème de fonctionnement avec EntityManagerFactory

@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; 
    } 
} 

Mon application chargée avant ajouté la section //get symbols et les choses EntityManager. Maintenant, je vois l'erreur SEVERE: Exception lors du chargement de l'application: java.lang.IllegalStateException: ContainerBase.addChild: début: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.NullPointerException

J'ai lu que j'ai besoin de définir un unitName, mais alors je regarde this documentation et il ne montre pas cela étant fait.

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> 

Je vais avoir du mal à déterminer ce que je fais mal.

mise à jour

Mon modèle définit la base de données et tout cela comme on le voit ci-dessous. Ai-je besoin d'un 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 + " ]"; 
     } 

    } 

Répondre

1

utiliser uniquement

@Controller 
public class Content { 

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

Le gestionnaire d'entités doit être contrôlée par ressort.

Ceci est un exemple, il utilise hiberante comme fournisseur de persistance, mais je pense que vous pouvez l'adapter.

<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> 

échantillon unité de persistence, qui fonctionne avec cette configuration

<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> 
+0

-je définir le grain dans les applicationContext.xml? C'est ma première visite à Java, alors s'il vous plaît, si j'ai du mal à l'adapter à mes besoins ... quand j'essaie de copier ce que vous avez et de changer 'myPersistenceUnit' en' CMTPU', il lance l'erreur 'Erreur de création de haricot avec le nom 'entityManagerFactory' défini dans la ressource ServletContext [/WEB-INF/applicationContext.xml]: Impossible de créer le bean interne 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 17b51d9' de type [org.springframework.orm.jpa. vendor.HibernateJpaVendorAdapter] lors de la définition de la propriété bean 'jpaVendorAdapter'; ... ' – Webnet

+0

Ingore mon commentaire précédent ... Je n'avais pas inclus les changements' persistence-unit' dont vous avez parlé. Après avoir implémenté ce changement, je vois que le contenu non valide a été trouvé en commençant par l'élément 'properties'. Aucun élément enfant n'est attendu à ce stade. – Webnet

+0

Où est ce problème, persistence.xml ou spring config? Cela ressemble à un problème de xml, vérifiez le xml. (J'ai copié le code et je l'ai modifié un peu, puis-je supprimer une fermeture de xml eleemnt) – Ralph

Questions connexes