java– 当我尝试在数据库中插入数据时,“org.hibernate.PersistentObjectException:传递给持久化的分离实体”

java– 当我尝试在数据库中插入数据时,“org.hibernate.PersistentObjectException:传递给持久化的分离实体”,第1张

概述我正在尝试在数据库中持有一个实体类,为此我尝试了几个不同的类实现,但仍然面临错误(但不同的错误).我的实体类现在是这样的:@Entity @Table(name='pagina') public class Pagina extends Entidade { @Id @Column(name = 'id') @GeneratedVa

我正在尝试在数据库中持有一个实体类,为此我尝试了几个不同的类实现,但仍然面临错误(但不同的错误).我的实体类现在是这样的:

@Entity@table(name="pagina")public class Pagina extends EntIDade {    @ID    @Column(name = "ID")    @GeneratedValue(strategy=GenerationType.IDENTITY)    private Integer ID;    @Column(name = "nome",unique=true)    private String nome;    @Column(name = "titulo")    private String titulo;    @Column(name = "descricao")    private String descricao;    @OnetoOne( cascade = {CascadeType.ALL},fetch = FetchType.EAGER )    @JoinColumn(name="parent_page")    @Cascade(org.hibernate.annotations.CascadeType.ALL)    private Pagina pagina;    @OnetoOne( cascade = {CascadeType.ALL},fetch = FetchType.EAGER )    @JoinColumn(name="parent_product")    @Cascade(org.hibernate.annotations.CascadeType.ALL)    private Produto produto;}

在我的Dao类中,我为我的方法persist(…)尝试了这两个实现:

@Transactionalpublic boolean persist(E transIEntInstance) {    try {        sessionFactory.getCurrentSession().persist(transIEntInstance);        return true;    } catch (RuntimeException e) {        e.printstacktrace();        return false;    }}

@Transactionalpublic boolean persist(E transIEntInstance) {    try {        sessionFactory.getCurrentSession().save(transIEntInstance);        return true;    } catch (RuntimeException e) {        e.printstacktrace();        return false;    }}

使用这两个选项,如果我尝试保存一个没有属性Pagina或Produto的实体,它就会存储在数据库中而没有任何问题.但是,如果我尝试使用此属性提交数据,我会遇到问题.

使用第一个选项,异常org.hibernate.PersistentObjectException:传递给persist的分离实体被触发,而使用第二个选项,数据存储在数据库中,但是有错误,因为没有值的额外行存储在数据库,我插入的数据行指向该行.

谁知道这里发生了什么?因为我不知道.

PS:

我有这个视图在该表中插入数据:

由这种方法处理:

在控制器类中

@RequestMapPing(value="cadastra",method=RequestMethod.POST)@ResponseBodypublic String cadastra(@modelattribute("object") E object,BindingResult result) {    if(serv.cadastra(object))        return "yes";    else        return "not";}

在服务类中

@PreAuthorize("hasPermission(#user,'cadastra_'+#this.this.name)")@Transactionalpublic boolean cadastra(E e) {    return dao.persist(e);}

UPDATE

stacktrace与我尝试插入实体时发生的错误:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.spring.loja.model.pagina.persistence.model.Pagina    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:801)    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:794)    at org.hibernate.engine.spi.CascadingActions.cascade(CascadingActions.java:314)    at org.hibernate.engine.internal.Cascade.cascadetoOne(Cascade.java:350)    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:432)    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:265)    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedID(AbstractSaveEventListener.java:125)    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransIEnt(DefaultPersistEventListener.java:206)    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)    at com.spring.loja.config.generic.persistence.Dao.persist(Dao.java:33)    at com.spring.loja.config.generic.persistence.Dao$$FastClassBySpringcglib$$ddbbe880.invoke(
最佳答案org.hibernate.PersistentObjectException:传递给persist的分离实体

这个错误可以像这样解释(ouf,如何在不描述Hibernate / JPA的整个对象生命周期的情况下这样做?):

使用JPA / Hibernate,您可以将类定义为Entitys.这意味着该类的对象可以由Hibernate管理,因此可以存储在数据库中.

@Entitypublic class Entity { /** ... */ }

当你创建一个实体(新实体())类的新对象时,Hibernate对它一无所知.它不存储在数据库中,并且不受任何方式的Hibernate控制.如果我们想要发生这些事情,我们需要坚持我们的对象(em.persist(entity)).当我们这样做时,对象状态存储在数据库中,而且,对象本身由Hibernate管理,这意味着Hibernate将跟踪对象的状态.此外,如果您已指定Hibernate生成ID,则会为该对象分配一个ID.

当您通过Hibernate从数据库加载对象时,此对象也将由Hibernate管理.新持久化或加载的对象都将具有ID,并且都将由Hibernate管理.但是,对象和Hibernate之间的连接可以被打破!发生这种情况时,对象会分离.分离的对象实际上只是实体类的一个对象,它具有ID设置,但不受Hibernate管理.

我们在分离对象时所拥有的选项与我们对托管对象或新对象的选项不同.与托管对象不同,不允许将分离的对象传递给persist-method,因为它们已经具有ID,这意味着它们必须已经被保留!当想要获取分离的对象并使其受管时,合并方法就是要使用的方法. (http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#merge(T))
这将合并分离对象的状态与对象ID对应的数据库状态.

调用与新对象(没有ID)的合并将为其分配一个ID并保存它,但要注意它不会对象​​传递作为参数做任何事情,而是返回托管对象.

public Entity saveDetached(final Entity entity) {    return em.merge(entity);} 

在您的情况下,解决方案将取决于几个因素,但如果引用的Pagina将始终是数据库中已存在的那个,我将从中删除持久化 *** 作的级联,并继续使用em.persist()(合并有它的弱点..)如果它可能是新的有时您还需要添加一些逻辑来确定是否持久化(在持久拥有对象之前). (我也认为从数据库中加载Pagina和Produto并将它们分配给新的Pagina可能会有效.)

TL; DR

将分离的对象重新引入持久性上下文时,请使用EntityManager的merge-method,而不是persist-method.

总结

以上是内存溢出为你收集整理的java – 当我尝试在数据库中插入数据时,“org.hibernate.PersistentObjectException:传递给持久化的分离实体”全部内容,希望文章能够帮你解决java – 当我尝试在数据库中插入数据时,“org.hibernate.PersistentObjectException:传递给持久化的分离实体”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1248420.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)