[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[eclipselink-users] Many-To-Many Remove Problem
|
I have a problem with updating a JPA entity where a many-to-many relationship
is involved. It appears to be some sort of session caching issue but I
can't find the source of the problem
I can add items to my main entity and see that the many-to-many mapping
table updates with the results. When I re-select the main entity and
display the values it shows all of the mapped items. When I remove a mapped
item and re-select the entity the removed item(s) still show up in the
select query. However, if I look at the mapping table in the database the
items did remove correctly.
My case is this -
main table:
MEDIA_CATEGORY
category_id integer PK
cat_description varchar(50)
second table:
KEYWORDS
kw_id integer PK
kw_name varchar(50)
mapping table:
CATKWMAP
kw_id integer PK
category_id integer PK
The MEDIA_CATEGORY JPA entity class is MediaCategory. Here are the column
to attribute mappings -
@Column(name = "CATEGORY_ID", nullable = false)
private Integer categoryId;
@Column(name = "CAT_DESCRIPTION")
private String catDescription;
@JoinTable(name = "CATKWMAP", joinColumns = {@JoinColumn(name =
"CATEGORY_ID", referencedColumnName = "CATEGORY_ID")}, inverseJoinColumns =
{@JoinColumn(name = "KW_ID", referencedColumnName = "KW_ID")})
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Collection<Keywords> catKwCollection;
In my update code I just populate a MediaCategory class with the categoryId,
catDescription and a collection of keywords ( catKwCollection );
I then tell the EntityManager to merge the changes -
em.merge(mediaCategory);
After that occurs I checked the CATKWMAP table in the database and can see
that the submitted keyword-to-media_category mappings are there. Whether
the merge occurs where keywords are added or removed the database table ends
up with the correct results.
If I add code to check the MEDIA_CATEGORY record right after the merge -
MediaCategory mcUpdated = em.merge(mc);
Collection<Keywords> kwListing = mcUpdated .getCatKwCollection();
for (Iterator it = kwListing.iterator(); it.hasNext();) {
KwList kwl = (KwList) it.next();
log("updateMediaCategory - keyword: " + kwl.toString());
}
The output shows keywords that match what the updated table has.
But if I go to a screen where I select the updated MediaCategory ID and have
my code re-select the record using -
MediaCategory mc = em.find(MediaCategory.class, categoryId);
...the mc.getCatKwCollection() contains all of the keywords I had prior to
the update. In other words, if my update removed some keyword relationships
and the table shows them removed, they still exist in this selected
MediaCategory instance.
I have to stop my web application, restart it and re-select the
MediaCategory record in order to be in-sync with the database. What is
going on here? I tried adding a - em.flush() after my merge but it didn't
help.
Thanks,
-sonavor
--
View this message in context: http://www.nabble.com/Many-To-Many-Remove-Problem-tp25218190p25218190.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.