我正在运行spring + hibernate + JUnit,并将springJunit4runner和事务设置为默认回滚,而我正在使用内存中的derbydb作为数据库。 Hibernate用作JPA Provider,并且我已经成功测试了CRUD之类的东西。但是,我对JPA和@GeneratedValue的行为有疑问
如果我单独运行一个测试,则两个实体的ID为1和2。如果我运行整个测试套件,则ID分别为6和7。Spring的回滚很好,因此数据库中只有这两个实体加法之后,当然之前为零。但是@GeneratedValue的行为不允许我可靠地找到findById,除非我将从
dao.add(Entity e) //method
我不想为了测试而这样做,还是返回保留的实体是一种好习惯,所以我还是应该这样做吗?
最佳答案
您的测试实际上不应该取决于所生成的特定ID值。ID分配是数据库和持久层的调用,而不是您承担假设的责任。dao.add(Entity e)
不会在实体中设置ID/主键属性吗?通常,Hibernate至少在存储实体之前设置ID,至少要生成和按序列分配ID。
(顺便说一句,我强烈建议您使用可移植的(基于表的)分配器,并且永远不要依赖于特定于数据库的分配机制-序列或自动增量列。可移植的分配器工作得更快并且取决于专有的 key 分配将使其非常有用很难在其他数据库上运行。)
通常,保存数据的系统确实需要知道已保存到哪个ID的方法。否则,将没有可靠且独特的检索方法,这就是我们首先拥有PK的全部原因!
因此,您最好在这一点上找到正确的方法。