2013-11-26 78 views
1

我有以下代码,我在这里设置@Transactional(readOnly = true)@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

您需要将一个@Repository注释,使其工作

@Transactional 
@Repository 
public class AnnotatedCrudDao extends JdbcDaoSupport { 
+0

我加了@Repository。它仍然不起作用。 –

+0

确保添加包扫描以将bean包含到应用程序上下文中。 –

0

您正在创建自己的AnnotatedCrudDao对象。因此,Spring无法处理它并添加@Transactional行为。

AnnotatedCrudDao service = new AnnotatedCrudDao(); 

让Spring管理你的对象。在你的上下文中为它声明一个<bean>元素,然后使用它。

2

几件事情

  1. 您正在创建自己的DAO实例,这不是Spring管理并没有为此正在与@Transactional注解来实现。
  2. readonly="true"强制执行任何事情不要指望抛出异常或插入不会发生,很少有jdbc提供程序实际上对readOnly标志执行某些操作。这只不过是底层系统的暗示罢了。一般来说,它被像Hibernate之类的ORM工具所使用和理解。但在大多数情况下,对于普通的JDBC访问,它只是被忽略。
相关问题