7

我正在使用JPA toplink-essentialSQL Server 2008

我的目标是获取要插入表中的数据的自动增量主键值。我知道在 JDBC 中,有类似 getInsertedId() 的方法可以为您提供自动增量主 ID 的 ID(但那是在执行插入语句之后)

在 JPA 中,我发现@GenratedValue annotation可以解决问题。

@Entity
@Table(name = "tableOne")
public class TableOne implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "tableId")
    private Integer tableId;

现在,如果我运行下面的代码,它应该给我自动递增的 id ,但它返回 NULL...

 EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
 EntityTransaction txn = em.getTransaction();
 txn.begin();

 TableOne parent = new TableOne();
 em.persist(parent); //here I assume that id is pre-generated for me.
 System.out.println(parent.getTableId()); //this returns NULL :(
4

3 回答 3

11

问题是您正在使用 IDENTITY id 生成。IDENTITY id 生成不能进行预分配,因为它们需要 INSERT 来生成 id。TABLE 和 SEQUENCE id 生成支持预分配,我总是建议使用这些,并且因为这个问题和性能,从不使用 IDENTITY。

您可以在使用 IDENTITY id 生成时通过调用 flush() 来触发要生成的 id。

于 2011-02-02T15:16:10.353 回答
6

只需这样做:

public void create(T entity) {
   getEntityManager().persist(entity);
   getEntityManager().flush();
   getEntityManager().refresh(entity);
}

刷新实体后,您的 ID 字段具有适当的值。

于 2012-07-18T06:05:53.270 回答
2

我们也在使用 SQL Server 2008,它从来没有为我工作过,所以我总是执行单独的查询"SELECT @@IDENTY"来获取插入的 id。

我在网上找到的原因是 auto id (IDENTITY) 由数据库管理,除非您提交行或手动从数据库中检索信息,否则永远不会在 Entity 中获取。

于 2011-02-02T09:31:11.113 回答