2016-03-17 95 views
1

我想保存數據使用hsqldb,我使用休眠4.1.4.Final。我的問題是我要救堅持用數據,但是當我試圖做它的顯示以下錯誤:保存工作,但堅持不工作在休眠4.1.1

org.hibernate.PersistentObjectException: detached entity passed to persist: main.java.entity.Advocate 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:835) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:828) 
    at org.hibernate.engine.spi.CascadingAction$7.cascade(CascadingAction.java:315) 
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:844) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:819) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:823) 
    at main.java.service.LegalService.registerCase(LegalService.java:46) 
    at main.java.tester.Tester.registerCase(Tester.java:52) 
    at main.java.tester.Tester.main(Tester.java:28) 

但是當我使用Save方法是我worked.So想知道如何堅持和保存,使區別?我的實體類是序列化的。如何解決這個持續性錯誤。

這裏是我的類

package main.java.service; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 
import org.hibernate.service.ServiceRegistryBuilder; 

import main.java.businessTier.CaseTO; 
import main.java.entity.Advocate; 
import main.java.entity.Case; 

public class LegalService { 

    Configuration configuration = new Configuration().configure(); 

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
       configuration.getProperties()). buildServiceRegistry(); 
    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 







    public int registerCase(CaseTO caseTO) { 
     try 
     { 
      Session session; 
      session=sessionFactory.openSession(); 
      session.beginTransaction(); 

     Case c = new Case(); 
     Advocate a = new Advocate(); 
     a.setAdvocateId(caseTO.getAdvocateId()); 
     c.setAdvocate(a); 
     c.setClientAge(caseTO.getClientAge()); 
     c.setClientName(caseTO.getClientName()); 
     c.setDate(caseTO.getDate()); 
     c.setDescription(caseTO.getDescription()); 

     session.persist(c); 
     session.getTransaction().commit(); 
     return c.getCaseNo(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      return 0; 
     } 



    } 

} 

這裏是我的實體類 Advocate.java

package main.java.entity; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

import org.hibernate.annotations.DynamicInsert; 
import org.hibernate.annotations.DynamicUpdate; 

@Entity 
@Table(name="Db_Advocate") 
@DynamicInsert(value=true) 
@DynamicUpdate(value=true) 
public class Advocate { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="advocateId") 
    private Integer advocateId; 

    @Column(name="name") 
    private String name; 
    @Column(name="age") 
    private Integer age; 
    @Column(name="category") 
    private String category; 
    @Column(name="court") 
    private String court; 
    @Column(name="city") 
    private String city; 
    public Integer getAdvocateId() { 
     return advocateId; 
    } 
    public void setAdvocateId(Integer advocateId) { 
     this.advocateId = advocateId; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getAge() { 
     return age; 
    } 
    public void setAge(Integer age) { 
     this.age = age; 
    } 
    public String getCategory() { 
     return category; 
    } 
    public void setCategory(String category) { 
     this.category = category; 
    } 
    public String getCourt() { 
     return court; 
    } 
    public void setCourt(String court) { 
     this.court = court; 
    } 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 



} 

Case.java

package main.java.entity; 

import java.util.Date; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 


import org.hibernate.annotations.DynamicInsert; 
import org.hibernate.annotations.DynamicUpdate; 

@Entity 
@Table(name="DB_CASE") 
@DynamicInsert(value=true) 
@DynamicUpdate(value=true) 
public class Case { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer caseNo; 
    @JoinColumn(name="advocateId") 
    @ManyToOne(cascade=CascadeType.ALL) 
    private Advocate advocate; 
    private String clientName; 
    private Integer clientAge; 
    private String description; 
    private Date date; 


    public Integer getCaseNo() { 
     return caseNo; 
    } 

    @Column(name="caseNo") 
    public void setCaseNo(Integer caseNo) { 
     this.caseNo = caseNo; 
    } 
    public Advocate getAdvocate() { 
     return advocate; 
    } 


    public void setAdvocate(Advocate advocateId) { 
     this.advocate = advocateId; 
    } 
    public String getClientName() { 
     return clientName; 
    } 
    public void setClientName(String clientName) { 
     this.clientName = clientName; 
    } 
    public Integer getClientAge() { 
     return clientAge; 
    } 
    public void setClientAge(Integer clientAge) { 
     this.clientAge = clientAge; 
    } 
    public String getDescription() { 
     return description; 
    } 
    public void setDescription(String description) { 
     this.description = description; 
    } 
    public Date getDate() { 
     return date; 
    } 

    @Column(name="data",nullable=true) 
    public void setDate(Date date) { 
     this.date = date; 
    } 



} 
+0

的可能重複[這是什麼)的持續優勢(VS保存()在休眠?](http://stackoverflow.com/questions/5862680/whats-the-advantage-of-persist-vs-save-in-hibernate) – Chris311

+0

@ Chris311:我看到了答案,但無法瞭解 – LowCool

+0

請張貼實體 – Zulfi

回答

0

首先你需要了解的行爲堅持()。 以下是這將有助於鏈接你理解的行爲 Whats the difference between persist() and save() in Hibernate? http://javarevisited.blogspot.in/2012/09/difference-hibernate-save-vs-persist-and-saveOrUpdate.html

現在,爲了解決你的代碼這個問題..使用合併(),而不是堅持()。

爲什麼堅持(),獲得例外

堅持()爲分離對象。你需要知道Hibernate怎樣確定對象是否脫落或不不起作用。

UPDATE

爲什麼標識符生成策略自動解決您的問題

正如我上面,你需要了解由休眠標識對象是否脫落或短暫的規則提及。以下是規則

  1. 如果實體具有空值的標識符或版本屬性爲null它被認爲是暫時的其他明智的分離。

  2. 如果您使用自動生成的標識符,並且標識符不爲空,那麼Hibernate會將其視爲分離的實體。

  3. 如果您正在使用分配的標識符策略,那麼hibernate會發出一個提取來確定標識符是否存在於數據庫中,基於您的實體是臨時還是分離。

現在說說..我們分析你的代碼。

在你的代碼有其標識符策略IDENTITY.In下面的代碼

Case c = new Case(); 
    Advocate a = new Advocate(); 
    a.setAdvocateId(caseTO.getAdvocateId()); 

要設置倡導實例的標識屬性manually.At沖水的時候提交事務,Hibernate會倡導實體看到標識符生成策略是IDENTITY,標識符值在倡導者實例中設置,因此它會斷定實體實例是分離的(這是來自上述規則1)。因此,persist()方法給出了提倡實例,因爲它被認爲是從冬眠中分離出來的。

從規則2中,我們可以說只是通過將生成策略更改爲auto,您的代碼將無法工作。您可能已經做了一些其他更改。

我已經試過你的代碼我的系統中,它給予相同的異常上,即使我改變生成策略自動這是符合規則

你可能會做一些在你的代碼不同..請檢查並更新。

也請發表您的倡導者和與自動生成策略數據庫提倡產生實際的標識設置標識,這可能是有益的

+0

好吧..但你能解釋我的id生成策略如何使持續或保存的差異? – LowCool

+0

:感謝您的詳細說明。雅是自動策略工作的不同版本的代碼。 – LowCool

0

請添加下面的代碼在ID

@Id @GeneratedValue(策略= GenerationType.AUTO)

然後堅持將工作

+0

@Sateeesh Bhoopathi:你能告訴我如何生成類型使持續存在差異嗎? – LowCool