2015-11-18 31 views
5

Hayır EntityManager diyoruz 'devam' olamaz - güvenilir süreç devam, ben JUnit ile bir test yaptığınızdaHayır EntityManager - güvenilir süreç Şu anki işlem için kullanılabilir fiili işlemle

diyoruz 'devam' olamaz

applicationContext.xml

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



<!-- <bean id="notification" class="com.app.sqli.notification.NotificationTask" /> --> 

<!-- <task:scheduled-tasks> --> 
<!--  <task:scheduled ref="notification" method="notifier" cron="*/2 * * * * *"/> --> 
<!-- </task:scheduled-tasks> --> 

<context:component-scan base-package="com.app.sqli" /> 

    <mvc:annotation-driven /> 
    <bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.app.sqli.entities" /> 
     <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
     </property> 
    </bean> 


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/sqli" /> 
     <property name="username" value="root" /> 
     <property name="password" value="" /> 
    </bean> 


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


    <tx:annotation-driven /> 


</beans> 
: yöntem çalışır ve benim nesne yerleştirildiğinde görüyoruz, ama benim Kontrolör sayesinde yöntemini çağırdığınızda burada

çalışmıyor benim Projesi

benim Modeli Sınıf:

package com.app.sqli.models; 

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class Collaborateur { 

    @Id 
    private int id; 
    private String nom; 

    public int getId() { 
     return id; 
    } 

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

    public String getNom() { 
     return nom; 
    } 

    public void setNom(String nom) { 
     this.nom = nom; 
    } 

} 

benim DAO Sınıf

package com.app.sqli.dao; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.springframework.stereotype.Repository; 

import com.app.sqli.models.Collaborateur; 

@Repository 
public class CollaborateurDao implements IcollaborateurDao{ 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public void addCollaborateur(Collaborateur c) { 
    em.persist(c); 

    } 

} 

Benim Hizmet Sınıfı

package com.app.sqli.services; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.app.sqli.dao.IcollaborateurDao; 
import com.app.sqli.models.Collaborateur; 

@Service 
@Transactional 
public class CollaborateurService implements IcollaborateurService{ 

    @Autowired 
    private IcollaborateurDao cdao; 

    @Override 
    public void addCollaborateur(Collaborateur c) { 
     cdao.addCollaborateur(c); 

    } 


} 

Ve My Kontrolör

package com.app.sqli.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

import com.app.sqli.models.Collaborateur; 
import com.app.sqli.services.IcollaborateurService; 

@org.springframework.stereotype.Controller 
public class Controller { 
    @Autowired 
    private IcollaborateurService cserv; 

    @RequestMapping(value = "/index") 
    public String index(Model m) { 
     System.out.println("insertion ..."); 
     Collaborateur c = new Collaborateur(); 
     c.setId(11); 
     c.setNom("nom"); 
     cserv.addCollaborateur(c); 
     return "index"; 
    } 

} 
+1

? İstisnaı bilmeden, aklıma gelen tek şey EM'nizde PersistenceContextType.Extended kullanıyor. @PersistenceContext (type = PersistenceContextType.EXTENDED) \t EntityManager em; – Mechkov

+0

Aldığım Hata: org.springframework.web.util.NestedServletException: İstek işleme başarısız; iç içe istisna javax.persistence.TransactionRequiredException: Şu anki işlem için kullanılabilir fiili işlem ile hiçbir EntityManager - güvenilir işlemi PersistanceContextType.Extended ile denedin mi –

+1

diyoruz 'devam' olamaz? Bilinmeyen bir varlık: Özetle, bu Şimdi ben bu hata mesajını var ... – Mechkov

cevap

5

zaman ve yardım için teşekkürler Mechkov, Benim yapılandırma dosyamı değiştirerek benim sorun çözüldü, bu yüzden ben bir açıklama ve ek açıklamaları ile bir Yapılandırma Sınıfı kullandım çok iyi, ben hala sorun nerede olduğunu bilmiyorum

@Configuration 
    @ComponentScan(basePackages = "your package") 
    @EnableTransactionManagement 
    public class DatabaseConfig { 

     protected static final String PROPERTY_NAME_DATABASE_DRIVER = "com.mysql.jdbc.Driver"; 
     protected static final String PROPERTY_NAME_DATABASE_PASSWORD = "password"; 
     protected static final String PROPERTY_NAME_DATABASE_URL = "jdbc:mysql://localhost:3306/databasename"; 
     protected static final String PROPERTY_NAME_DATABASE_USERNAME = "login"; 

     private static final String PROPERTY_PACKAGES_TO_SCAN = "where your models are"; 
     @Bean 
     public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){ 
      LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
      entityManagerFactoryBean.setDataSource(dataSource); 
      entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
      entityManagerFactoryBean.setPackagesToScan(PROPERTY_PACKAGES_TO_SCAN); 
      return entityManagerFactoryBean; 
     } 

     @Bean 
     public BasicDataSource dataSource(){ 
      BasicDataSource ds = new BasicDataSource(); 
      ds.setDriverClassName(PROPERTY_NAME_DATABASE_DRIVER); 
      ds.setUrl(PROPERTY_NAME_DATABASE_URL); 
      ds.setUsername(PROPERTY_NAME_DATABASE_USERNAME); 
      ds.setPassword(PROPERTY_NAME_DATABASE_PASSWORD); 
      ds.setInitialSize(5); 
      return ds; 
     } 

     @Bean 
     public JpaVendorAdapter jpaVendorAdapter(){ 
      HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
      adapter.setDatabase(Database.MYSQL); 
      adapter.setShowSql(true); 
      adapter.setGenerateDdl(true); 

//I'm using MySQL5InnoDBDialect to make my tables support foreign keys 
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); 
      return adapter; 
     } 

     @Bean 
     public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
      return new JpaTransactionManager(entityManagerFactory); 
     } 


    } 
+0

Aynı istisnayı aldım ve başlangıçtan ek açıklama kullanıyorum. Bu örnekten @EnableTransactionManagement ekleyerek sorunu çözdüm. Teşekkürler. Ben ben tanımlanan fasulye yöntemlerine çağrıları ile dataSource ve jpaVendorAdapter için LocalContainerEntityManagerFactoryBean ait ayarlayıcılar sağlıyordu - Daha iyi benim fasulye için ayarlanmış - – pram

+0

Evet, burada aynı (gerek @EnableTransactionManagement) değil, aynı zamanda bu cevaptan bir külçe panoda Bu, konteynır yönetimine ve yan etkilerden emin olmadığına inanıyorum ama bunu okuduktan sonra her şeyi haklıyorum ve sorunlarım gitti: D – Psyrus

1

Sadece onaylamak için, son fasulye tanımını eklemek bu sorunu çözer!

Benim yapılandırma sınıfı aşağıdaki gibidir: Bu (bugün) okuyor herkes aynı durumda olarak varsa bilmiyorum

@Transactional 
@Repository 
public class FSService implements IDAO<FuelStation> { 

    @PersistenceContext 
    private EntityManager EM; 

    public EntityManager getEM() { 
     return EM; 
    } 

    public void setEM(EntityManager EM) { 
     this.EM = EM; 
    } 

    @Override 
    public List<FuelStation> getAll() { 
     return EM.createNamedQuery("FuelStation.findAll") 
       .getResultList(); 
    } 

    @Override 
    public FuelStation getByID(String ID) { 
     FuelStation fs = (FuelStation) EM.createNamedQuery("FuelStation.findById") 
       .setParameter("id", ID) 
       .getSingleResult(); 

     return fs; 
    } 

    @Override 
    public void update(FuelStation entity) { 
     EM.merge(entity); 
    } 

} 
3

şu şekildedir: Hizmetin kendisi olduğunu

@Configuration 
@EnableTransactionManagement 
@ComponentScan 
public class OFSConfig { 

    @Bean 
    public IDAO<FuelStation> getFSService() { 
     return new FSService(); 
    } 

    @Bean 
    public LocalEntityManagerFactoryBean emfBean() { 
     LocalEntityManagerFactoryBean e = new LocalEntityManagerFactoryBean(); 
     e.setPersistenceUnitName("org.superbapps.db_OWSDB_PU"); 

     return e; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory em) { 
     return new JpaTransactionManager(em); 
    } 
} 

Benimki, ama aynı problemi yaşadım. Luckly, ben sadece benim bahar-conf.xml içinde aşağıdaki koyarak bunu düzeltmek olabilir:

<beans xmlns="http://www.springframework.org/schema/beans" 
... 
xmlns:tx="http://www.springframework.org/schema/tx" 
... 
xsi:schemaLocation=" 
... 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd"> 

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

<!-- This does the trick! --> 
<tx:annotation-driven transaction-manager="tManager" /> 

Not: Ben ek açıklamalar yoluyla bildirim işlemleri kullanıyorum. Yani, eğer yaparsanız, yönteminizi @Transactional ile ekleyerek sorununuzu da çözebilirsiniz.

REFERANS: Eğer alıyorsanız istisna nedir

  1. http://blog.jhades.org/how-does-spring-transactional-really-work/
  2. http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/transaction.html