2011-10-12 116 views
0

我一直在試圖刪除JPA實體上的反向關係,但是這一直沒有奏效。我現在正在嘗試將ManyToOne屬性設置爲null,然後使用entityManager的合併方法保存它。 ManyToOne關係用cascade all屬性標記,但是在dataBase中不會刪除外鍵。我應該怎麼做?非常感謝。JPA刪除反比關係

回答

1

用代碼來找出你的意思會更容易。但我會盡量嘗試:

@Entity 
public class AEntity { 
    @GeneratedValue (strategy = GenerationType.SEQUENCE) 
    @Id int id; 

    //Having some cascade here doesn't matter for our case 
    //because we now do not cascade anything, we just set this field to 
    //null. Cascade=REMOVE is about never meaningful (and never fully 
    //fully portable) in ManyToOne side: 
    //just think what happens to other AEntity instances that refer to 
    //same BEntity. 
    @ManyToOne 
    BEntity bEntity; 

    public void setbEntity(BEntity bEntity) { 
     this.bEntity = bEntity; 
    } 
} 

public class BEntity { 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Id int id; 
} 

在一開始,我們有以下數據:
AEntity(ID = 1,bEntity_id = 2)
BEntity(ID = 2)

然後刪除之間的連接和b:

AEntity oldDirty = em.find(AEntity.class, 1); 
//modify A somewhere else in code 
oldDirty.setbEntity(null); 
//and bring changes in: 
em.merge(oldDirty); 

之後,我們有:
AEntity(ID = 1,bEntity_id = NULL)
BEntity(ⅰ d = 2)

如果BEntity還建立包含AEntity實體(這麼說的雙向關係),那麼你必須也從那裏刪除,因爲你要不斷關心自己的關係。 OneToMany方面是可以從中級聯移除的方法。

0

檢查兩端關係的級聯類型。舉例來說,如果你想,當你刪除的主要實體,刪除所有相關實體,註釋應該是這樣的:@ManyToOne(cascade={CascadeType.REMOVE}),並在逆@OneToMany(cascade={CascadeType.REMOVE})

+0

你想使用刪除多對一的一面,當要發生的事情?在最好的情況下,當然可以有一些供應商特定的有意義的功能。 –