我有一个基于 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上做了一些搜索。这是我尝试过的。
- 对 **Tests 类中的每个方法都使用了 @Rollback 注释。
- 在所有 **Tests 类的类级别使用 @TransactionConfiguration(defaultRollback=true)。
但是,这些修改都不起作用。
注意我的 windows vs linux 环境的版本和/或差异。我不确定他们会有所作为。
- spring框架3.2.2.RELEASE
- 春天 jpa 1.3.1.RELEASE
- Maven 万能插件 2.15
- maven 3.0.5(Linux 上的版本 3.1.0)
- 六月 4.11
- JDK 1.7
- MySql 5.6.11(Linux 上的版本 5.1.69)
另外,请注意,在“mvn clean test”之后,在 Windows 上,如果我做
select * from user;
然后我得到 0 个结果。但在 linux 上,我确实看到用户行/记录在表中。这就是我认为回滚在 linux 上不起作用的原因。