JPA中,在调用persist()时,数据库自动增长的主键如何处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA中,在调用persist()时,数据库自动增长的主键如何处理相关的知识,希望对你有一定的参考价值。

比如有一张表account是 id, username, password.其中id是数据库自增长主键。
创建了一个account对象a,字段username和password自己赋值,那么em.persist(a)时,会报错。因为我没有给id..但id是数据库自增长的,我应该怎么处理啊?
初学者,恳请指教。

你加事务处理了吗?
persist在事务外执行的话,不会执行insert语句
你用的什么数据库,oracle?追问

mysql 我加了事务处理了

追答

如果你id在数据库中已经使用了 自增列 的话
在你的代码上添加
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId()
return id;

追问

还是不行啊。。有一个exception叫 illegalArgumentException:id to load is required for loading

追答

试一下:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
最好把你的实体类和em.persist(a)整个方法都发出来

参考技术A 在数据库里面建一个序列,插入之前先查出序列号,然后把它当id插进去追问

能给一些代码示例么?大概写几行就好了。谢谢啊

参考技术B @GeneratedValue
这个默认的id生成策略是自增的。
你在你的实体类中标记了么?类似于下面的?
private Integer id;
private String name;
private Catalog parent;
private Set<Catalog> childs;
@Id
@Column(name="id",unique=true,nullable=false,insertable=true)
@GeneratedValue
public Integer getId()
return id;
追问

没有。。我试试

jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常

 jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常

 

  发生这个原因是因为我们已经在实体类用JPA注解指定了主键的生成策略主键就不能设置了,一旦不为空或者0就被认为是已经保存到了数据库中,一旦调用persist()方法就会抛出上面的异常

  把0去掉,如下图:

 

  

 

以上是关于JPA中,在调用persist()时,数据库自动增长的主键如何处理的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA 关联关系

jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常

合并有时在 JPA Hibernate 中失败,但在同一事务中 PERSIST 有效

JPA 和 Hibernate 中的 persist() 和 merge() 有啥区别?

Jpa中的persist方法和merge方法都有哪些区别,帮我举一个例子解释下?

JPA 错误未标记级联 PERSIST 的关系