ManyToMany association within conversation scope bean
avpavlov Dec 4, 2007 12:13 PMHi all.
I have 2 entities linked via many-to-many association
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements Serializable {
@Id
@GeneratedValue
private long id;
@NotEmpty
@Column(unique = true)
private String username;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name="UserToProvider",
joinColumns = { @JoinColumn( name="user_id") },
inverseJoinColumns = @JoinColumn( name="provider_id")
)
private Collection<Provider> providers = new ArrayList<Provider>();
}
@Entity
@Table(name="Provider" )
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Provider implements Serializable {
@Id
@GeneratedValue
private int id;
@NotNull
private String UPI; //Unique Provider identifier
@ManyToMany(mappedBy="providers", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Collection<User> users;
}
Users list displayed on Provider form
....
<h:panelGrid title="Users">
<ui:repeat var="user" value="#{providerFormAction.provider.users}">
<h:commandLink value="#{user.firstName} #{user.lastName}" action="#{userFormAction.view(user)}"/>
<br/>
</ui:repeat>
<h:commandButton action="#{userFormAction.addNew}" value="Add new"/>
...
userFormAction.addNew() and .view() methods are marked as starting nested conversation. Save() method finihes current converastion and restore parent.
public class UserFormAction implements java.io.Serializable {
@In
EntityManager entityManager = null;
@In
Conversation conversation;
private User user = null;
@Begin(nested=true)
public String addNew() {
user = new User();
return "/jspx/userForm.jspx";
}
@Begin(nested=true)
public String view(User u) {
user = u;
return "/jspx/userForm.jspx";
}
public void save() {
entityManager.persist(user);
// tried flush - it did not help!!!
// entityManager.flush();
// to return to previous conversation
conversation.endAndRedirect();
}
....
After returning to Provider form it is still displaying OLD links (i.e. if I created new user linked to this provider - it is not displayed, if I removed link - it is still displayed as linked), although username is refreshed!
If I clear conversationId in browser address bar then links become correct.
Looks like marked as "mappedBy" end of many-to-many association is not refreshed properly in Seam - I tested other fields type - simple properties, ManyToOne, active end of ManyToMany - all refreshed properly OR I'M WRONG?.