我使用hibernate 4,spring 4,我想使用@Transaction注释,但它不起作用。
用户对象仍保存在sqlServer上。
知道我做错了吗?
[applicationContext.xml]
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="SpringDAO"/>
<context:component-scan base-package="SpringTest"/>
<context:component-scan base-package="service"/>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:sqlserver://127.0.0.1:1433;databaseName=test</value>
</property>
<property name="username">
<value>XXX</value>
</property>
<property name="password">
<value>XXX</value>
</property>
</bean>
[hibernate.cfg.xml]
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="SpringDAO.User" />
</session-factory>
</hibernate-configuration>
package SpringDAO;
@Repository("UserDAO3")
public class UserDAO3 {
SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory value){
this.sessionFactory = value;
}
public SessionFactory getSessionFactory(){
return this.sessionFactory;
}
@Transactional(readOnly = true)
public boolean insert(Object user){
Session sess = this.sessionFactory.getCurrentSession();
sess.save(user);
return true;
}
}
package service;
@Service("UserService")
public class UserService {
public boolean addAction(User user){
boolean result = true;
UserDAO3 dao = (UserDAO3)SpringUtil.getBean("UserDAO3");
List<User> users = dao.searchAllUser();
for(User selectedUser : users){
if(selectedUser.getName().equals(user.getName())){
result = false;
break;
}
}
result = dao.insert(user);
return result;
}
}
答案 0 :(得分:0)
来自docs,
这只是 作为实际交易子系统的提示;它不会 必然导致写访问尝试失败。交易 无法解释只读提示的管理器不会抛出 当被要求进行只读交易时会出现异常。
事务的隔离级别是否可以更改取决于实现。根据驱动程序可能会发生不同的事情,无法保证,它不会强制执行失败。
答案 1 :(得分:0)
POJO:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
修饰:
@Id
@Column(name = "id")
private Integer id;
消除@GeneratedValue(strategy = GenerationType.AUTO)
答案 2 :(得分:0)
在ibm.com上查看@Transactional read-only flag pitfalls,解释真的很棒。你的问题在那里得到解答。