IDENTITY_INSERT与JPA

ang*_*yip 3 java hibernate jpa

我试图将一些假数据插入SQL Server Express数据库.我正在使用这样一些简单的代码:

@Entity
@Table(name = "People")
public class Peeps implements Serializable {

    @Id
    @Column(name = "ID", columnDefinition = "Decimal(10,0)")
    private String id;

    @Column(name = "PERSON_NAME")
    private String name;

}
Run Code Online (Sandbox Code Playgroud)

我调用实体管理器创建上面的类,如下所示:

private EntityManager em = createManager();
private EntityTransaction utx = em.getTransaction();

final Peeps entity = new Peeps();
entity.setId("10002");
entity.setName("Joe");
utx.begin();
em.persist(entity);
utx.commit();
Run Code Online (Sandbox Code Playgroud)

但是,这样做时,我收到一个错误::

 Cannot insert explicit value for identity column in table 'People' when IDENTITY_INSERT is set to OFF
Run Code Online (Sandbox Code Playgroud)

所以我尝试做的是这样的:

em.createNativeQuery("SET IDENTITY_INSERT People ON").executeUpdate();
em.persist(entity);
em.createNativeQuery("SET IDENTITY_INSERT People OFF").executeUpdate();
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到同样的错误.我的直觉使我相信连接没有被分享.在调用持久性之前,我可以做些什么来指示hibernate将IDENTITY_INSERT设置为ON吗?

Mos*_*rad 8

您缺少id字段下的下一行:

@GeneratedValue(strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

所以你的id字段应如下所示:

@Entity
@Table(name = "People")
public class Peeps implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID", columnDefinition = "Decimal(10,0)")
    private String id;

    @Column(name = "PERSON_NAME")
    private String name;

}
Run Code Online (Sandbox Code Playgroud)

其次,您不应该自己为您的实体设置ID,当您使用hibernate持久化时,ID将自动生成.

所以摆脱: entity.setId("10002");

并且这样做:

private EntityManager em = createManager();
private EntityTransaction utx = em.getTransaction();

final Peeps entity = new Peeps();
entity.setName("Joe");
utx.begin();
em.persist(entity);
utx.commit();
Run Code Online (Sandbox Code Playgroud)

其他东西确保您在数据库表中配置主键,并自动增加.