2013-07-31 78 views
0

我有一個OneToMany關係,我可以插入記錄但不能刪除它們,當我嘗試刪除它時會遇到「外鍵約束失敗」錯誤。我已經使用級聯刪除孤兒如下,但不工作。不能在休眠狀態下刪除OneToMany關係的一個實例

父類有以下的getter其成員

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.OneToMany; 

@Entity 
@DynamicUpdate 
public class User extends Employee{ 
    private string userli; 
    privae List<Message> messagelist(); 

    ..... 

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE) 
    public List<Message> getMessagelist() { 
     return messagelist; 
    } 

成員類有以下的getter其父

import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
...... 

    @ManyToOne 
    public User getReciever() { 
     return reciever; 
    } 

我用下面的註釋,以及,但沒有奏效

 @Cascade(org.hibernate.annotations.CascadeType.DELETE) 

我的休眠依賴如下

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>4.2.1.Final</version> 
    <type>jar</type> 
</dependency> 

我的代碼來刪除該消息

  Message message = (Message) session.get(Message.class, id); 
      session.delete(message); 
      tx.commit(); 

回答

1
Try to change the cascade = cascadeType.ALL 

and check 

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL) 
    public List<Message> getMessagelist() { 
      return messagelist; 

It might work but not sure 
+0

運行到同樣的錯誤。 –

1

有幾種方式與一對多關係的工作。其中最常見的方式是這樣的:

@OneToMany(mappedBy="receiver", CascadeType.REMOVE) 
public List<Message> getMessagelist() { 
     return messagelist; 
} 

.... 

@ManyToOne 
public User getReciever() { 
     return reciever; 
} 

注意,取= FetchType.LAZY是你並不真的需要指定它的默認值。

此外,您可能需要重新創建表格,因爲已經創建了數據庫約束。在這種情況下,不要信任hbm2ddl.auto = update 100%。我建議刪除相關的表(Message,Reciver和Receiver_Message或Message_Receiver)。接下來,您可以使用hbm2ddl.auto = update。

我希望它有幫助。

乾杯

+0

使用您的代碼後,它不會拋出異常,但仍不能刪除記錄。 –

+0

它是否從Receiver_Message或Message_Receiver表中刪除? – Rafa

0

嘗試添加下列註釋。它爲我工作。

@OneToMany(mappedBy="receiver", cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
public Set<Message> getMessagelist() { 
    return messagelist; 
} 

我使用實體管理器中刪除方法,它爲我工作。在我看來,我使用Set而不是List,這是一種有效的方式。

刪除孤兒註釋只是告訴休眠,如果「我從MessageList中刪除實體和嘗試合併用戶,那麼你可以安全地刪除信息」

@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)