我试图将一些假数据插入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;
}
我调用实体管理器创建上面的类,如下所示:
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();
但是,这样做时,我收到错误::
Cannot insert explicit value for identity column in table 'People' when IDENTITY_INSERT is set to OFF
所以我尝试做的是这样的:
em.createNativeQuery("SET IDENTITY_INSERT People ON").executeUpdate();
em.persist(entity);
em.createNativeQuery("SET IDENTITY_INSERT People OFF").executeUpdate();
但是,我仍然得到同样的错误。我的直觉使我相信连接没有被分享。在调用持久性之前,我可以做些什么来指示hibernate将 IDENTITY_INSERT 设置为 ON 吗?
答案 0 :(得分:7)
您错过了ID字段下的下一行:
@GeneratedValue(strategy=GenerationType.IDENTITY)
所以你的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;
}
其次,您不应该自己为您的实体设置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();
其他一些事项确保您在数据库表中配置主键,并自动增加。