当前位置: 首页 > 面试题库 >

JPA-在persist()之后返回自动生成的ID

贝阳泽
2023-03-14
问题内容

我正在使用JPA(EclipseLink)和Spring。假设我有一个带有自动生成的ID的简单实体:

@Entity
public class ABC implements Serializable {
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;

     // ...
}

在我的DAO类中,我有一个调用persist()此实体的insert方法。我希望该方法为新实体返回生成的ID,但是当我对其进行测试时,它将返回0

public class ABCDao {
    @PersistenceContext
    EntityManager em;

    @Transactional(readOnly=false)
    public int insertABC(ABC abc) {
         em.persist(abc);
         // I WANT TO RETURN THE AUTO-GENERATED ID OF abc
         // HOW CAN I DO IT?
         return abc.id; // ???
    }
}

我还有一个包装DAO的服务类,如果有区别的话:

public class ABCService {
    @Resource(name="ABCDao")
    ABCDao abcDao;

    public int addNewABC(ABC abc) {
         return abcDao.insertABC(abc);
    }
}

问题答案:

该ID仅保证在刷新时生成。持久实体只会使它“附加”到持久性上下文。因此,要么显式刷新实体管理器:

em.persist(abc);
em.flush();
return abc.getId();

或返回实体本身而不是其ID。当事务结束时,将发生刷新,事务外部实体的用户将因此在实体中看到生成的ID。

@Override
public ABC addNewABC(ABC abc) {
    abcDao.insertABC(abc);
    return abc;
}


 类似资料:
  • 问题内容: 我在Employee类中有以下定义 现在,我想使用现有员工ID导入现有员工。即使在保存之前设置了员工ID,也会忽略分配的ID,并存储自动递增的ID。我们如何覆盖呢? 问题答案: 我编写了自己的生成器来解决此问题。 并像这样使用它:(替换包名)

  • 问题内容: 我的主键实体如下所示 当我跑步时,出现错误 无法获取或更新下一个值;嵌套的异常是org.hibernate.exception.SQLGrammerException:无法获取或更新下一个值 但是当我改变为 没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。 问题答案: 当将新创建的实体插入数据库时,告诉JPA提供者使用表从中获取ID。 当使用Hibernate作为提

  • 使用JOOQ(与sqlite3一起)。 有一些代码如下所示:(根据文档中的示例修改:https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos/) 此时,我需要知道从数据库自动生成的ID。 有什么想法吗? 还是在保存之前需要设置ID?

  • 我有一个单一的页面应用程序,它连接到不同服务器上的后端REST API。 在应用程序加载时,首先要做的是,它包含REST API服务器的URL。显然,在生产中与在测试中和在开发中是不同的。 有没有什么方法可以将中间件添加到webpack-dev-server中,这样当它看到时,它就会自动生成json(基于env var或其他)? 如果有更简单的办法,我是开放的。我的假设是,dev和test将启动一

  • 是否有方法重写build方法返回SampleClass以避免执行build.build?

  • 我希望对web api自动生成的帮助页面进行一些澄清。 据我所知,如果我返回一个Type,它将自动生成带有示例的该操作的帮助页面。但是如果我使用Http响应消息,那么它无法猜测响应将是什么并且只能对请求参数进行假设是可以理解的。 我使用 HttpResponse 消息的原因是,当状态代码可能与 200 不同时,建议指示您希望返回的状态代码。 那么,什么是能够返回您想要的状态代码的最佳实践方法,但仍