2

我有一个基于 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 上不起作用的原因。

4

1 回答 1

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 的自动回滚机制从未起作用。

于 2013-08-07T18:57:16.073 回答