我有一个基于Spring的Java EE Web应用程序。我正在使用junit测试存储库层(数据访问对象层)。我使用maven来构建和测试我的项目。
我的问题是: 当我在Windows上运行测试时,spring的自动/默认回滚行为工作,但是,当我部署到我的linux开发服务器并尝试运行测试时,回滚行为似乎不起作用 。
这是一个示例表。请注意,用户名字段被指定为唯一。
create table user (
id mediumint not null auto_increment,
username varchar(50),
passwd varchar(50),
unique(username)
);
这是我的普通旧java对象(pojo)建模这个表。
@Entity
@Table(name="user")
public class User {
@Column(name="id")
public int id;
@Column(name="username")
public String username;
@Column(name="passwd")
public String passwd;
public void User() { }
public void User(String username, String passwd) {
this.username = username;
this.passwd = passwd;
}
}
然后我有一个JPA存储库来保存用户,如下所示。
@Repository
public class JpaUserRepository {
@PersistenceContext
EntityManager em;
public User find(int id) {
User user = this.em.find(User.class, id);
return user;
}
public void save(User user) {
this.em.persist(user);
}
public void delete(User user) {
this.em.remove(user);
}
}
我使用junit的单元测试如下。
@ContextConfiguration(locations={"classpath:spring/business.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class JpaUserRepositoryTests {
@AutoWired
UserRepository userRepository;
@Test
@Transactional
public void testSave() {
User user = new User("user1","pw");
userRepository.save(userRepository);
user = userRepository.find(user.id);
Assert.assertNotNull(user);
}
@Test
@Transactional
public void testDelete() {
User user = new User("user1","pw");
userRepository.save(userRepository);
user = userRepository.find(user.id);
Assert.assertNotNull(user);
userRepository.delete(user);
user = userRepository.find(user.id);
Assert.assertNull(user);
}
}
再次,在Windows上,当我运行“mvn clean test”时,我没有失败。但是,当我在我的linux(CentOS 6.4 x64)框中运行它时,由于“user1”值,我得到一个org.hibernate.exception.ConstraintViolationException。
我在stackoverflow上做了一些搜索。这是我试过的。
请注意我的Windows与Linux环境的版本和/或差异。我不确定他们会有所作为。
另外,请注意在“mvn clean test”之后,在windows上,如果我做了
select * from user;
然后我得到0结果。但在linux上,我确实看到用户行/记录在表中。这就是我认为回滚不适用于linux的原因。
答案 0 :(得分:0)
在我的Windows框中,我使用的是MySQL v5.6.11。 在我的linux机器上,我使用的是MySQL v5.1.69。
根据此链接http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html,innodb是从v5.5开始的默认存储引擎,在v5.5之前,myisam是默认的存储引擎。
根据此链接http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html,它强化了myisam是v5.1中的默认存储引擎。
所以,在我的linux机器上,我在v5.1.69上,默认存储是myisam,因此,spring的自动回滚机制从未起作用。