jpa repository save方法从插入数据库的id返回不同的id

Sin*_*DEM 3 eclipse spring oracle11g spring-data-jpa

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

当我调试时,我发现repository.save方法返回的"utilisateur"对象具有类似" 2100 " 的id,而数据库中对应的插入行具有类似" 43 " 的id .

我有一个带有序列和触发器的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;
Run Code Online (Sandbox Code Playgroud)

问题出在哪儿?它在save方法中吗?

谢谢.


编辑:

我发现@jhadesdev的解决方案已经解决了问题,并且当触发器处于活动状态时插入了我正在讨论的数据行.

最后,我必须提到,默认情况下,JUnit测试似乎不会在数据库中插入数据(它会插入然后回滚).为了使此行为无效,我们必须@TransactionConfiguration(defaultRollback=false)在测试类中指定注释.

例如(在我的情况下):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context/dao-context.xml" })
@TransactionConfiguration(defaultRollback=false)
@Transactional
public class UtilisateurRepositoryTest {
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.

Ang*_*ity 5

问题是有两个独立的机制来生成密钥:

  • 一个在Hibernate级别调用序列并使用该值填充Id列并将其作为插入键发送到数据库
  • 和Hibernate不知道的数据库中的另一种机制:列通过触发器递增.

Hibernate认为插入是使用序列的值进行的,但是在数据库中发生了其他事情.最简单的解决方案可能是删除触发机制,让Hibernate仅根据序列填充密钥.