簡體   English   中英

休眠:使用復雜對象的集合會引發異常

[英]Hibernate: Using collection of complex objects throws exceptions

我正在研究Hibernate,並存儲復雜類型的集合。 但是我遇到了例外。

我有以下持久性課程:

public class Item {

    private Long id;
    private Set images = new HashSet();
    private Collection<Data> data = new ArrayList<Data>();

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Set getImages() {
        return images;
    }
    public void setImages(Set images) {
        this.images = images;
    }
    public Collection<Data> getData() {
        return data;
    }
    public void setData(Collection<Data> data) {
        this.data = data;
    }
}

數據類如下:

public class Data {

  private String firstName;
  private String lastName;
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;     
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  @Override
   public boolean equals(Object obj) {
    if(!(obj instanceof Data) )
        return false;
    Data d = (Data) obj;
    if(d.firstName.equals(firstName) && d.lastName.equals(lastName))
        return true;
    return false;
  }
 @Override
 public int hashCode() {
    int result;
    result = 17;
    result = 31 * result + firstName.hashCode();
    result = 31 * result + lastName.hashCode();
    return result;
}

映射文件如下:
對於商品類:

<hibernate-mapping>
    <class name="com.entities.Item" table="ITEM">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="identity" />
        </id>
        <set name="images" table="ITEM_IMAGE" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <element type="string">
                <column name="IMAGES" />
            </element>
        </set>
        <bag name="data" table="DATA" inverse="false" lazy="true">
            <key>
                <column name="ID" />
            </key>
            <one-to-many class="com.entities.Data" />
        </bag>
    </class>
</hibernate-mapping>

對於數據類:

<hibernate-mapping>
    <class name="com.entities.Data" table="DATA">    
        <id name="firstName" type="java.lang.String">
            <column name="FIRSTNAME" />
            <generator class="assigned" />
        </id>
        <property name="lastName" type="java.lang.String">
            <column name="LASTNAME" />
        </property>
    </class>
</hibernate-mapping>

在我的將數據保存到MySQL的代碼中:

Transaction tx = session.beginTransaction();
Item item = new Item();
Set images = new HashSet();
images.add("C:\\");
images.add("D:\\");
item.setImages(images);
List<Data> data = new ArrayList<Data>();
Data a = new Data();
a.setFirstName("John");
a.setLastName("Smith");
data.add(a);
item.setData(data);
session.save(item);
tx.commit();//-->Exception here
session.close();

我在tx.commit();上收到以下異常tx.commit();

休眠:插入ITEM值()休眠:插入ITEM_IMAGE(ID,IMAGES)值(?,?)休眠:插入ITEM_IMAGE(ID,IMAGES)值(?,?)休眠:更新數據集ID =? 其中FIRSTNAME =? 休眠:更新數據集ID =? 其中FIRSTNAME =? 1454 [main]錯誤org.hibernate.jdbc.AbstractBatcher-執行批處理的異常:org.hibernate.StaleStateException:批處理更新從更新[0]返回意外行數; 實際行數:0; 預期值:org.hibernate.jdbc.BatchingBatcher的org.hibernate.jdbc.Expectations $ BasicExpectation $ BasicExpectation.verifyOutcome(Expectations.java:70)的org.hibernate.jdbc.Expectations $ BasicExpectation.checkBatched(Expectations.java:85)處為1。在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)在org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)處的checkRowCounts(BatchingBatcher.java:90)在org.hibernate.engine.ActionQueue處org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188)在org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)處的.executeActions(ActionQueue.java:268)。在org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)在org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)處的event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) .hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)位於com.entiti es.Main.main(Main.java:44)

為什么會出現此異常?
如果我刪除Collection<Data> data以僅存儲Set該代碼有效,並且數據保存在MySQL中。

注意:映射文件是由Eclipse Hibernate插件創建的。

對您的代碼進行了以下更改:

Transaction tx = session.beginTransaction();
Item item = new Item();
//added save here to attach the object to persistance context.
// (This might be optional)
session.save(item);              

Set images = new HashSet();
images.add("C:\\");
images.add("D:\\");
item.setImages(images);           
List<Data> data = new ArrayList<Data>();
Data a = new Data();
a.setFirstName("John");
a.setLastName("Smith");
//added save here to attach the object to persistance context.
//this is required without cascading settings
session.save(a)                 

data.add(a);
item.setData(data);
session.save(item);
tx.commit();//-->Exception here
session.close();

否則,您可以在袋子上設置適當的層疊選項!

AFAIK,您收到此錯誤,是因為您嘗試在沒有其他實體(數據)處於持久狀態的情況下保持關聯並且默認情況下將級聯選項設置為none。 再次,我沒有嘗試運行我的片段,但這將為您指明正確的方向。


從OP更新:

通過使用inverse="true"進行cascade解決了問題,而且我還必須從Data引用到Item否則FK列不會更新

可能是由於您向列表data添加a兩次的事實?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM