2016-07-12 4 views
1

Wir aktualisieren unser Projekt von Hibernate 3.6.10 auf Hibernate 5.2.0, erhalten jedoch Fehler bei der Migration. Ich habe hier auf StackOverFlow und Google viele Posts gelesen, aber keine Lösung gefunden.Hibernate5, Spring 4 - org.hibernate.HibernateException: Transaktionssynchronisierte Sitzung für aktuellen Thread konnte nicht abgerufen werden

Betrachten Sie die Codenummer this website. Ich habe nur die Datenbankverbindungen zu PostgreSQL Datenbank gemacht.

Wenn ich dieses Beispiel nach dem Hinzufügen dieser JARs (ALL Added JAR files screenshot) mit Ausnahme der Hibernate JAR 3.6.10-Finale, funktioniert es völlig in Ordnung. Aber wenn ich diese Änderungen für Hibernate 5 Upgrade machen:

  1. Ändern JAR-Datei hinzugefügt, wie Hibernate-core-5.2.1-Final.jar
  2. Ändern Referenz von Hibernate3 Dateien hibernate5 (3 Ersatz; 1 in EmployeeDao Import und weitere 2 in applicationContext.xml)

Es führt den folgenden Fehler:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. 
at org.springframework.orm.hibernate5.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1132) 
at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:618) 
at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:615) 
at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:340) 
at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:307) 
at org.springframework.orm.hibernate5.HibernateTemplate.save(HibernateTemplate.java:615) 
at hibernate.test.EmployeeDao.saveEmployee(EmployeeDao.java:12) 
at hibernate.test.InsertTest.main(InsertTest.java:21) 

und ich habe auch diese Änderungen aber den gleichen Fehler habe: 1. kommentierte dies in EmployeeDao:

/*HibernateTemplate template; 

public void setTemplate(HibernateTemplate template) { 
    this.template = template; 
} */ 

und sich HibernateDaoSupport, so dass es session Setter gibt.

Und unten Code ersetzen zu:

public void saveEmployee(Employee e){ 
    template.save(e); 
} 

dies:

public void saveEmployee(Employee e){ 
     this.getHibernateTemplate().save(e); 
} 

Nach dem Debuggen kam ich zu wissen, dass die erwähnte in HibernateTemplate-Klasse von Spring-orm-4.3.1 Jar wirft Error.

Here is the snapshot.

Kann jemand mir helfen, mit dieser aus: O. Wir sind hier seit Ewigkeiten festgefahren. Ich schätze Hilfe.

+0

Links zur Referenz oben: oder pic 2- http: //i.stack.imgur.com/NwPwl.png für Bild 3- http://i.stack.imgur.com/Zgx5d.png – JavaDeveloper

+0

Zunächst würde ich davon abraten, 'HibernateTemplate' zu ​​verwenden. Verweisen Sie diese Frage http://stackoverflow.com/questions/4067775/spring-hibernate-template-when-to-use-and-why. Lesen Sie die akzeptierte Antwort. Sie müssen von HibernateTemplate zu SessionFactory und zur deklarativen Transaktionsverwaltung migrieren. –

+0

@TheCoder Vielen Dank für Ihre Antwort. In diesem Projekt ist es so groß und jede neue Implementierung kann viel Zeit in Anspruch nehmen. Ich bin durch den erwähnten Thread gegangen und sie sagen, dass es aus dem Frühling entfernt wurde? aber ich verwende über den Import 'org.springframework.orm.hibernate5.HibernateTemplate'. Wie auch immer, bitte beantworte die obige Frage wenn möglich, das ist alles was ich brauche. Danke. – JavaDeveloper

Antwort

0

erstellen DataSource.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" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>classpath:properties/database.properties</value> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

erstellen session die eine separate hibernate.xml Datei wie unten

<?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" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<!-- Hibernate session factory --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 

    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">false</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 

    <property name="annotatedClasses"> 
    <list> 
     <value>com.rapidtech.rapidtechorganic.model.Lot</value> 
     <value>com.rapidtech.rapidtechorganic.model.ProductAvailable</value> 
     <value>com.rapidtech.rapidtechorganic.model.Client</value> 
     <value>com.rapidtech.rapidtechorganic.model.Invoice</value> 
     <value>com.rapidtech.rapidtechorganic.model.ProductBuyed</value> 
    </list> 
    </property> 

</bean> 
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 
gegeben

sowohl Fügen Sie die XML-Datei in Ihrem servel-context.xml

<!-- Database Configuration --> 
<beans:import resource="classpath:database/DataSource.xml"/> 
<beans:import resource="classpath:database/Hibernate.xml"/> 

Dann in Ihrer Abstrakte Klasse injiziert session

@Resource 
private SessionFactory sessionFactory; 
public void save(Entity entity){ 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(entity); 
    session.getTransaction().commit(); 
    session.close(); 
} 
+0

Danke für deine Antwort, du musst den ganzen Code eigentlich nicht posten, ich habe das schon überprüft. Was benötigt wurde, war, ** Beispielcode ** zu modifizieren, um openSession zu erstellen, das ist, was Sie tatsächlich tun, aber das war nicht die erwartete Antwort. HibernateTemplate löst Fehler in der Zeile 'session = getSessionFactory(). GetCurrentSession();' in der doExecute-Methode aus, was auf ein Konfigurationsproblem hindeutet. – JavaDeveloper

+0

Eigentlich verwende ich Winterschlaf 5 und Frühling 4. Früher hatte ich das gleiche Problem, aber nachdem ich es in den Code geändert habe, den ich hier gepostet habe, läuft alles gut. – tinku

+0

stellen Sie sicher, dass Sie in Ihrem Klassenpfad haben Hibernate-Entitymanager JAR-Datei – tinku

Verwandte Themen