eclipse - jpa存储库保存方法返回的ID与插入数据库的ID不同

标签 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);

当我调试时,我发现 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 {

希望它可以帮助某人。

最佳答案

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

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

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

    关于eclipse - jpa存储库保存方法返回的ID与插入数据库的ID不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997712/

    相关文章:

    java - 在模拟器/手机中运行应用程序时出现 NoClassDefFoundError [更新到上一个问题]

    java - Hibernate SessionFactory 到 Spring

    java - Spring引入访问原来引入的类

    sql - 使用 Oracle SQL Developer 导入 DMD 文件

    java - 更改项目方面后无法运行应用程序?

    android - 在 Eclipse Juno 4.2.1 中看不到 sdk 管理器工具

    eclipse - 将 "External Tool Configurations"从一个 Eclipse 安装转移到另一个安装的快速方法?

    spring - 如何使用spring数据模拟hdfs操作

    sql - 如何动态选择非空值列?

    oracle11g - 如何在 Oracle 11g 中使用列名查找存储过程的名称