我在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的異常而復原。