2012-05-29 33 views
0

我有以下實體關係: SIDEA:的EclipseLink 2一對多與一個關聯表如何從一個側刪除

@Entity 
@Table(name = "SideA") 
    public class SideA { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @CascadeOnDelete 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sideA", cascade=CascadeType.ALL) 
    private List<ABAssociation> association = new ArrayList<ABAssociation>(); 
} 

側B:

@Entity 
@Table(name = "SideB") 
public class SideB { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @CascadeOnDelete 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sideB", cascade=CascadeType.ALL) 
    private List<ABAssociation> association = new ArrayList<ABAssociation>(); 
} 

ABAssociation:

@Entity 
@Table(name = "ABAssociation") 
public class ABAssociation { 

    @EmbeddedId 
    private ABAssociationPK pk = new ABAssociationPK(); 
    @ManyToOne(cascade=CascadeType.MERGE) 
    @MapsId("aId") 
    private SideA sideA; 

    @ManyToOne(cascade=CascadeType.MERGE) 
    @MapsId("bId") 
    private SideB sideB; 
} 

ABAssociationPK:

@Embeddable 
public class ABAssociationPK implements java.io.Serializable{ 
    private long aId; 
    private long bId; 
} 

我的問題是當我刪除一邊時,數據庫刪除ABAssociation中的行,但仍然留在緩存中。

測試碼是像如下:

SideA a = new SideA(); 
SideB b = new SideB(); 
entitymanager.persist(a); 
entitymanager.persist(b); 

ABAssociation ab = new ABAssociation() 
ab.setSideA(a); 
ab.setSideB(b); 
entitymanager.persist(ab); 

a.getABAssociationList().add(ab); 
b.getABAssociationList().add(ab); 

a = entitymanager.merge(a); 
b = entitymanager.merge(b); 

entitymanager.delete(a); 

由於「一」被刪除,之間的「a」和「b」的關係也應該被刪除。 但是當我檢查「b.getABAssociationList()。size()」時,它仍然存在,即使DB中沒有ABAssociation表中的行。

它與共享緩存問題有關嗎?

+0

看一看有關JPA的實施模式這個有趣的博客,解釋發生了什麼事:http://blog.xebia.com/2009/ 03/16/jpa-implementation-patterns-bidirectional-association/ – perissf

+0

我有更糟的情況。我在java se環境下,實體不在同一個entitymanager範圍內。 – Xiwen

回答

2

某種程度上,是的。當ABAssociation被刪除以維護數據庫中的內容時,您需要刪除B對ABAssociation的引用。如果在應用程序中無法執行此操作,則可以通過在ABAssociation上使用preremove事件來實現此目的。

0

可以強制更新使用evict()你這樣的名單:

getEntityManager().getEntityManagerFactory().getCache().evict(ABAssociation.class); 
相關問題