JPA:Id列可自动和手动设置

时间:2009-05-20 09:08:57

标签: java mysql jpa

我正在使用MySQL并拥有以下实体:

class MyEntity {
    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="id")
    private Integer id;
}

但是,我仍然希望能够手动设置ID!

问题是INSERT永远不会插入id列。例如,什么时候 这样做:

MyEntity e = new MyEntity();
e.setId(15);
em.persist(e);
em.flush();
em.refresh(e);

将进行以下查询:

INSERT INTO myEntities (col1, col2, col3) VALUES (?, ?, ?)
SELECT id, col1, col2, col3 FROM myEntities WHERE (id = 15)

因此ID仍会自动生成,而refresh()会自动生成 结果为EntityNotFoundException

如果我根本没有设置@GeneratedValue,那么这个案例就行了, 但是当值自动生成时,将不会调用LAST_INSERT_ID()

是否可以手动设置id列 自动,就像在MySQL?

2 个答案:

答案 0 :(得分:2)

JPA不适合这种情况(也不是JDO);它假定您自己设置ID,或者使用提供的生成器生成它。 DataNucleus通过添加扩展 @Extension(key =“strategy-when-notnull”,value =“true”) 当您未设置“id”值时将生成该值,并在您提供时使用您的值。也许其他实现允许类似的东西?

- 安迪(DataNucleus)

答案 1 :(得分:0)

使用EclipseLink,手动分配ID将适用于基于TABLE的排序和SEQUENCE对象排序,但不适用于IDENTITY。