我正在使用spring数据(jpaRepository)+ Oracle 11g数据库。
这是我的JUnit测试的代码:
@Test
public void testAjoutUtilisateur() {
Utilisateur utilisateur = new Utilisateur();
(...)
utilisateur=repository.save(utilisateur);
Utilisateur dbutilisateur = repository.findOne(utilisateur.getIdutilisateur());
assertNotNull(dbutilisateur);
当我调试时,我发现repository.save
方法返回的“utilisateur”对象的ID为“ 2100 ”,而数据库中相应的插入行的ID为“ 43 ”。
我有一个带有序列和触发器的Oracle数据库,以便为我的“Utilisateur”表提供id的自动递增属性。
这是我的Utilisateur实体中的id定义:
@Entity
@NamedQuery(name="Utilisateur.findAll", query="SELECT u FROM Utilisateur u")
@SequenceGenerator(sequenceName="ID_UTILISATEUR_SEQ", name="ID_UTILISATEUR_SEQ")
public class Utilisateur implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ID_UTILISATEUR_SEQ")
private Long idutilisateur;
问题出在哪里?它在保存方法中吗?
谢谢。
修改
我发现问题已经通过@jhadesdev的解决方案解决了,当触发器处于活动状态时插入了我正在讨论的数据行。
最后,我必须提到,默认情况下,JUnit测试似乎不会在数据库中插入数据(它会插入然后回滚)。为了使此行为无效,我们必须在测试类中指定@TransactionConfiguration(defaultRollback=false)
注释。
例如(在我的情况下):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context/dao-context.xml" })
@TransactionConfiguration(defaultRollback=false)
@Transactional
public class UtilisateurRepositoryTest {
希望它可以帮助别人。
答案 0 :(得分:5)
问题在于有两个独立的机制来生成密钥:
Hibernate认为插入是使用序列的值进行的,但是在数据库中发生了其他事情。最简单的解决方案可能是删除触发机制,让Hibernate仅根据序列填充密钥。