0

助けが必要です。休止状態と春のトランザクションに問題があります。mysql でファイル テーブルをいっぱいにしようとしています。私の最初の挿入はうまくいきましたが、2番目の挿入はうまくいきませんでした(しかし、それは正常です...)。ただし、最初の挿入からのデータはテーブルにまだ存在します。これはトランザクションの概念に適合しません。私はこれで大丈夫ですか?

データベースに破損したデータを 2 回挿入しようとしたときにロールバックを実行する必要があると思います (破損したデータとは、フィールドの制約に一致しないデータを意味します)。 insert はロールバックする必要があり、テーブルにデータが存在しない必要があります。または、そうではありません。最初の挿入からの最初のデータは、まだテーブルにあります。それはまだ存在するべきではありませんか?

チェック済み/未チェックの例外、@transactionnal の設定ミスを試してみましたが成功しませんでした...

何かアイデアがあれば...

ありがとう !!

Main.java :

    public static void main( String[] args ) throws Exception{

            ApplicationContext appContext = new ClassPathXmlApplicationContext(    "classpath:webConfiguration/applicationContext.xml");

            FileBo aFileBo = (FileBo) appContext.getBean("fileBo");
// Data are ok, there is an insert.
File aFile = File (6778687,".bam");             
aFileBo.save(aFile);

// Error is produce here because the ".pdf" value is not tolerated in the enum field we want to fill up. No data is inserted. But a rollback should be done and data inserted before should be erased ?
File anAnotherFile = File (6567887,".pdf");             
aFileBo.save(anAnotherFile);

}

FileBoImpl.java

public class FileBoImpl implements FileBo{
FileDao fileDao;


public FileDao getFileDao() {
    return fileDao;
}


public void setFileDao(FileDao fileDao) {
    this.fileDao = fileDao;
}

@Transactional// one transaction for multiple operations
public void save(com.clb.genomic.lyon.model.File aFile) {

 fileDao.save(aFile);
}

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

<!-- Hibernate session factory -->
<bean id="sessionFactory"  class="org.springframework.orm.hibernate4.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">true</prop>
   </props>
 </property>

 <property name="mappingResources">
   ...
  </property>

</bean>

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

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

</bean> 

Hibernate.xml とともに applicationContext.xml で呼び出される Beans.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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">


<!--  Data Access Object -->

<bean id="fileDao" class="com.clb.genomic.lyon.dao.FileDaoImpl" >
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean> 

<!--  Business Object  -->

<bean id="fileBo" class="com.clb.genomic.lyon.bo.FileBoImpl" >
    <property name="fileDao" ref="fileDao"></property>
</bean> 

</beans>
4

1 に答える 1

0

ここでは、2 つの別個のトランザクションを使用しています。1 つは最初のファイルを保存するため、もう 1 つは 2 番目のファイルを保存するためです。したがって、2 番目のロールバック時に、最初の 1 つはすでにコミットされています。

2 つの保存を同じトランザクションの一部にする場合は、main から単一のトランザクション メソッドを呼び出し、このメソッドから 2 つのファイルを保存する必要があります。

public static void main( String[] args ) throws Exception{
    ApplicationContext appContext = new ClassPathXmlApplicationContext(    "classpath:webConfiguration/applicationContext.xml");

    FileBo aFileBo = (FileBo) appContext.getBean("fileBo");
    // Data are ok, there is an insert.
    File aFile = File (6778687,".bam");    
    File anAnotherFile = File (6567887,".pdf");  

    aFileBo.save(aFile, anotherFile);
}

public class FileBoImpl implements FileBo {
    FileDao fileDao;
    // ...

    @Transactional
    public void save(com.clb.genomic.lyon.model.File aFile, 
                     com.clb.genomic.lyon.model.File bFile) {

        fileDao.save(aFile);
        fileDao.save(bFile);

    }
}
于 2013-07-23T08:16:32.277 に答える