2017-04-20 193 views
0

我目前正在嘗試將spring與spring集成。我使用了dao設計模式和mysql作爲數據庫。 我試圖添加contacte實體在DB,但我得到這個錯誤春季4和休眠5集成

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:1165) 
    at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:643) 
    at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:640) 
    at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:359) 
    at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:326) 
    at org.springframework.orm.hibernate5.HibernateTemplate.save(HibernateTemplate.java:640) 
    at biz.picosoft.daoImpl.ContacteDaoImpl.inserteContacte(ContacteDaoImpl.java:20) 
    at biz.picosoft.mains.TestHibernate.main(TestHibernate.java:21) 

這是我的背景文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      "> 


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/mailmaneger" /> 
     <property name="username" value="root" /> 
     <property name="password" value="" /> 
     <property name="defaultAutoCommit" value="false" /> 
    </bean> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mysessionFactory" /> 
</bean> 
    <bean id="mysessionFactory" 
     class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 



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


      </props> 
     </property> 
    </bean> 

    <bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate"> 
     <property name="sessionFactory" ref="mysessionFactory"></property> 
    </bean> 

    <bean id="d" class="biz.picosoft.daoImpl.ContacteDaoImpl"> 
     <property name="template" ref="template"></property> 
    </bean> 

</beans> 

我的主文件

package biz.picosoft.mains; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.orm.hibernate5.LocalSessionFactoryBean; 

import biz.picosoft.daoImpl.ContacteDaoImpl; 
import biz.picosoft.entity.Contacte; 

public class TestHibernate { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
Contacte contacte=new Contacte("fatma", "test", "test", "test"); 
ApplicationContext context = 
new ClassPathXmlApplicationContext("applicationContext.xml"); 

ContacteDaoImpl contacteDaoImpl=(ContacteDaoImpl) context.getBean("d"); 


contacteDaoImpl.inserteContacte(contacte) ; 
    } 

} 

吾道文件

package biz.picosoft.daoImpl; 

import java.util.List; 

import org.springframework.orm.hibernate5.HibernateTemplate; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import biz.picosoft.entity.Contacte; 

public class ContacteDaoImpl implements ContacteDao{ 
    HibernateTemplate template; 
    public void setTemplate(HibernateTemplate template) { 
     this.template = template; 
    } 


    public void inserteContacte(Contacte contacte) { 
     // TODO Auto-generated method stub 
     template.save(contacte); 

    } 

    public void updateContacte(Contacte contacte) { 
     // TODO Auto-generated method stub 
     template.update(contacte); 
    } 

    public void deleteContacte(Contacte contacte) { 
     // TODO Auto-generated method stub 
     template.delete(contacte); 
    } 

    public Contacte getContacteById(int id) { 
     // TODO Auto-generated method stub 

     return template.get(Contacte.class, id); 
    } 

    public List<Contacte> getAll() { 
     // TODO Auto-generated method stub 
     return template.loadAll(Contacte.class); 
    } 
    public HibernateTemplate getTemplate() { 
     return template; 
    } 

} 

m Ÿ實體文件

package biz.picosoft.entity; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 



@Entity 
@Table(name = "Contacte") 
public class Contacte { 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "idContact") 
long idContact; 
@Column(name = "nom") 
String nom; 
@Column(name = "mail") 
String mail; 
@Column(name = "téléphone") 
String téléphone; 
@Column(name = "adresse") 
String adresse; 

public Contacte( String nom, String mail, String téléphone, String adresse) { 
    super(); 

    this.nom = nom; 
    this.mail = mail; 
    this.téléphone = téléphone; 
    this.adresse = adresse; 
} 

public long getIdContact() { 
    return idContact; 
} 


public String getNom() { 
    return nom; 
} 

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

public String getMail() { 
    return mail; 
} 

public void setMail(String mail) { 
    this.mail = mail; 
} 

public String getTéléphone() { 
    return téléphone; 
} 

public void setTéléphone(String téléphone) { 
    this.téléphone = téléphone; 
} 

public String getAdresse() { 
    return adresse; 
} 

public void setAdresse(String adresse) { 
    this.adresse = adresse; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (int) (idContact^(idContact >>> 32)); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Contacte other = (Contacte) obj; 
    if (idContact != other.idContact) 
     return false; 
    return true; 
} 


} 

我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd 
      http://www.springframework.org/schema/context/spring-context.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.picosoft.gestionCourrier</groupId> 
    <artifactId>gestion-courrier</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <repositories> 
     <repository> 
      <id>maven.alfresco.com</id> 
      <name>Alfresco Maven Repository</name> 
      <url>http://maven.alfresco.com/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 
    <dependencies> 
     <dependency> 
      <groupId>org.activiti</groupId> 
      <artifactId>activiti-spring</artifactId> 
      <version>5.14</version> 
     </dependency> 
     <dependency> 
      <groupId>org.activiti</groupId> 
      <artifactId>activiti-engine</artifactId> 
      <version>5.14</version> 
     </dependency> 
     <dependency> 
      <groupId>org.alfresco.cmis.client</groupId> 
      <artifactId>alfresco-opencmis-extension</artifactId> 
      <version>0.9</version> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.21</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.7.21</version> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.4.193</version> 
     </dependency> 
     <dependency> 
      <groupId>org.alfresco.cmis.client</groupId> 
      <artifactId>alfresco-opencmis-extension</artifactId> 
      <version>0.2</version> 
      <type>jar</type> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.2.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.6</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp --> 
     <dependency> 
      <groupId>commons-dbcp</groupId> 
      <artifactId>commons-dbcp</artifactId> 
      <version>1.2.2</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

類似的問題:http://stackoverflow.com/questions/6810158/Java的休眠寫的操作,都-不被允許功能於只讀模式 –

回答

0

最大的可能是你錯過了觸發交易。在您的context.xml中添加<tx:annotation-driven/>用於聲明式事務支持。並通過ContacteDaoImpl方法添加@Transactional(readOnly=false)

這應該可以解決您的問題。如果不是,可能還有別的東西。

0

我通過改變這些bean修正了這個問題,但現在看來,這就像創建表,但值未在表中添加

<bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate"> 
    <property name="sessionFactory" ref="mysessionFactory"></property> 
    <property name="checkWriteOperations" value="false"></property> 
</bean> 

    <bean id="mysessionFactory" 
      class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
       <property name="packagesToScan" value="biz.picosoft.entity"/> 



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


      <property name="hibernateProperties"> 

       <props> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
        <prop key="hibernate.hbm2ddl.auto">update</prop> 
        <prop key="hibernate.show_sql">true</prop> 


       </props> 
      </property> 
     </bean>