我有以下代码,我正在设置@Transactional(readOnly = true)
。
主要方法中的代码。
ApplicationContext context = Utils.getContext();
AnnotatedCrudDao service = new AnnotatedCrudDao();
DataSource dataSource = (DataSource) context.getBean("mySqlDataSource");
service.setDataSource(dataSource);
service.insert(account, user, movie);
@Transactional
public class AnnotatedCrudDao extends JdbcDaoSupport {
private static Logger logger;
static {
logger = Logger.getLogger(AnnotatedCrudDao.class);
}
@Transactional(readOnly = true)
public void insert(Account account, User user, MovieTicket movie) {
TicketUtils.insertAccount(getJdbcTemplate(), account);
TicketUtils.insertUser(getJdbcTemplate(), user);
TicketUtils.insertMovie(getJdbcTemplate(), movie);
}
}
class TicketUtils{
public static void insertUser(JdbcTemplate template, User user) {
String queryUser = "INSERT INTO t_user_txn (ID, NAME, ACCOUNT_ID, TICKETID) VALUES (?,?,?,?)";
logger.debug("queryUser" + queryUser);
template.update(queryUser, new Object[] { user.getId(), user.getName(),
user.getAccount().getId(), user.getTicketId() });
}
public static void insertMovie(JdbcTemplate template, MovieTicket movie) {
String queryMovie = "INSERT INTO t_movieticket_txn (ID, MOVIENAME, TOTALTICKETSCOUNT, PRICE) VALUES (?,?,?,?)";
logger.debug("queryMovie:" + queryMovie);
template.update(queryMovie, new Object[] { movie.getId(),
movie.getMovieName(), movie.getTotalTicketsCount(),
movie.getPrice() });
}
public static void insertAccount(JdbcTemplate template, Account account) {
String queryAccount = "INSERT INTO t_account_txn (ID, AMOUNT) VALUES (?,?)";
logger.debug("queryAccount:" + queryAccount);
template.update(queryAccount, new Object[] { account.getId(),
account.getAmount() });
}
}
上下文
<bean id="mySqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:qadb7"/>
<property name="username" value="tp2"/>
<property name="password" value="tp2"/>
</bean>
<bean id="dsTxnMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mySqlDataSource" />
</bean>
<!-- Add this tag to enable annotations transactions -->
<tx:annotation-driven transaction-manager="dsTxnMgr" />
即使我已经为插入方法设置了@Transactional(readOnly = true)
,仍然正在执行插入操作。设置为true的属性readOnly
不应该注意不能对此方法执行插入。
答案 0 :(得分:3)
一些事情
@Transactional
注释没有做任何事情。readonly="true"
强制执行任何操作,不要指望抛出异常或插入不会发生,很少有jdbc提供程序实际使用readOnly
标志执行某些操作。它只是对底层系统的一个暗示而已。通常,它由诸如Hibernate之类的ORM工具使用和理解。但是对于大多数情况下的普通JDBC访问,它只是被忽略了。答案 1 :(得分:0)
您需要放置@Repository
注释才能使其正常工作
@Transactional
@Repository
public class AnnotatedCrudDao extends JdbcDaoSupport {
答案 2 :(得分:0)
您自己正在创建AnnotatedCrudDao
对象。因此,Spring无法处理它并添加@Transactional
行为。
AnnotatedCrudDao service = new AnnotatedCrudDao();
让Spring管理你的对象。在您的上下文中为它声明一个<bean>
元素,然后使用它。