PostgreSQL と共に Spring JDBC テンプレートを使用しています。以下は私の構成データソースとトランザクション設定です:
<bean id="databasePropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/config/database.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${database.driverClassName}"
p:url="${database.url}"
p:username="${database.username}"
p:password="${database.password}" />
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
私のビジネスレイヤーでは、次のことを行っています。
@Transactional(rollbackFor=Exception.class)
@RequiresPermissions("hc:patient_createInvoice")
public Long createInvoice(Invoice invoice, List<InvoiceItem> items) throws ValidationException, NetAmountMismatchException, PatientInvoiceException
{
try{
dao1.insert(invoice);
}
catch(DataAccessException x){
throw new PatientInvoiceException(x);
}
try{
somevalidation(invoiceItem); // Causes validation exception
dao2.insert(invoiceItems);
}
catch(DataAccessException x){
throw new PatientInvoiceException(x);
}
}
そんな感じ。私が必要とするのは、このメソッドから例外 (チェック済みまたは未チェック) がスローされるたびに、これまでに実行されたすべてのデータベース更新をロールする必要があることです。
これは、現在のコードでは発生していません。
私は実際に何が欠けていますか?