【问题标题】:JPA How to get the value from database after persistJPA持久化后如何从数据库中获取值
【发布时间】:2013-07-25 06:44:45
【问题描述】:

如何获取保存到数据库后的值

entityManager.persist

调用persist而不是任何其他值后,我能够从数据库中获取主键值。 例如

public void create(Project project) {
    entityManager.persist(project);     
    System.out.println("Id    -- " + project.getProjectId());
    System.out.println("no -- " + project.getProjectNo());
}

从上面的代码中,我能够从project.getProjectId 中获取新插入的值,但无法获取project.getProjectNo

我之所以能够得到projectId是因为它是主键吗?

persist后如何获取getProjectNo的值?

【问题讨论】:

  • ProjectNo 是生成值吗?你确定它是在调用之前设置的吗?值是否出现在数据库中?如果它没有生成并且您设置了值,则 orm 不应将该字段设为空。
  • @KevinBowersox projectNo 是使用数据库触发器生成的数据库值。
  • 您需要设置一个序列生成器。它可能与身份一起使用,因为这假设数据库将像您的触发器一样在插入中设置 id。
  • @Chris 你的意思是说 projectNo 不是唯一键,而 projectId 是 id 并且被触发是从数据库中取回值?
  • 不,我是说 JPA 无法获取触发器设置的值,除非您告诉它该值是由数据库在插入时设置的。这样做的方法是指定使用排序,特别是 GenerationType.IDENTITY。这将告诉 JPA 数据库正在设置该值,因此它可以使用数据库的特定方式查找它。见en.wikibooks.org/wiki/Java_Persistence/…

标签: java hibernate jpa jpa-2.0


【解决方案1】:

尝试用数据库刷新实体以获取插入的触发器值。

public void create(Project project) {
        entityManager.persist(project);
        entityManager.getTransaction().commit();
        project = entityManager.find(Project.class, project.getProjectId());
        entityManager.refresh(project);
        System.out.println("Id    -- " + project.getProjectId());
            System.out.println("no -- " + project.getProjectNo());
    }

Documentation

【讨论】:

  • 刷新将不起作用,除非它具有要在刷新查询中使用的 id。
  • Kevin 添加entityManager.refresh 导致以下异常org.hibernate.HibernateException: this instance does not yet exist as a row in the database
  • 如果刷新 entityManager 会怎样? entityManager.flush();
  • entityManager.flush(); 没有引起任何错误,但projectNo 仍然为空;
  • 并且该值存在于数据库中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2012-03-27
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多