0

私は次の実体関連を持っています:SideA:

@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」が削除されたので、「a」と「b」の関係も削除する必要があります。しかし、「b.getABAssociationList()。size()」をチェックすると、DBのABAssociationテーブルに行がない場合でもまだそこにあります。

これは共有キャッシュの問題に関連していますか?

4

3 に答える 3

2

やや、はい。データベースにあるものでキャッシュを維持するために、ABAssociation が削除されたときに、B の ABAssociation への参照を削除する必要があります。アプリケーションでこれを実行できない場合は、ABAssociation で preremove イベントを使用してこれを実行できます。

于 2012-05-30T14:57:18.037 に答える
2

JPA では、オブジェクトの関係を維持する必要があります。

オブジェクトを削除する場合は、最初にそのオブジェクトへのすべての参照を削除する必要があります。

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_sideを参照して ください

于 2012-05-30T14:54:35.997 に答える
0

evict()次のように使用して、リストを強制的に更新できます。

getEntityManager().getEntityManagerFactory().getCache().evict(ABAssociation.class);
于 2015-05-29T12:28:58.770 に答える