天天看點

spring mysql 事務復原失敗_Spring事務復原失敗

我在Service層裡面調用兩個Dao層的方法。一個方法用于儲存一行Investor資料,一個方法用于儲存和有Investor主鍵的Address資料。service層方法如下,注意Investor繼承Person,放在同一個資料庫表裡面。

@Service

public class ServiceImpl implements PortfolioService {

@Autowired

private PersonDao personDao;//Dao層接口

@Transactional(rollbackFor = { Throwable.class })

public void addInvestor(String personCode, String firstName, String lastName, String country, String state,

String street) {

Investor p = new Investor(personCode,firstName,lastName);

int personId = personDao.addPerson(p);//第一個方法添加investor,方法傳回該行資料自動生成的主鍵

Address ad = new Address(street,state, country);

personDao.addAddress(ad,personId);//第二個方法添加address,前面生成的personId會成為Address屬性,因為Address對應一個investor

}

}

我必須保證這兩個方法的原子性,如果addAddress出現了問題,addPerson必須復原。但是我的方法始終沒有達到復原的效果。我成功地插入一行person資料,addAddress方法出錯,addPerson方法卻沒有復原。

以下是相關的xml配置檔案和代碼

Spring-Hibernate.xml

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

pojo

pojoView

${jdbc.mysql.dialect}

${jdbc.hibernate.hbm2ddl.auto}

true

true

classpath*:hibernate.cfg.xml

class="org.springframework.orm.hibernate5.HibernateTransactionManager">

下面是我在UnitTest方法裡面調用Service層的方法。

PersonTest.java

public class PersonTest extends BaseTest {

@Autowired

private PortfolioService ps;

public PersonTest() {

System.out.println("PersonTest構造方法");

}

@Test

public void test8() {

ps.addInvestor("kk5", "m4", "chrow", "Cua", "Nebska", "D stret");

}

BaseTest.java

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath*:Spring-Hibernate.xml")

public class BaseTest {

@Before

public void init() {

System.out.println("initializing");

}

}

PersonDaoImpl.java

@Repository

public class PersonDaoImpl implements PersonDao {

@Autowired

private SessionFactory sessionFactory;

public void addAddress(Address ad,int personId) {

Session session = sessionFactory.openSession();

//ad.setPersonId(personId);

session.save(ad);

session.close();

}

public int addPerson(Person p) {

Session session = sessionFactory.openSession();

session.save(p);

int personId = p.getPersonId();

session.close();

return personId;

}

}

請大神指點一下這個為什麼不能復原,測試方法test8()沒有報錯,隻是Investor的資料被存入了資料庫,沒有因為addAddress的異常而復原。