Auto-commit with a4j:commandLink?
josief Sep 9, 2008 10:41 AMHi!
I have a problem and I don't understand what's going on! Just like there is a autocommit mode that is enabled and I don't get why and how.
This is my code :
I have a class that contains a Collection :
@Entity
public class ExperimentalGroup {
...
@OneToMany(mappedBy = "experimentalGroup", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY)
private Collection<RelSubjectExperimentalGroup> relSubjectExperimentalGroupList = new ArrayList<RelSubjectExperimentalGroup>(0);
...
And the objects that are contained in the collection:
@Entity
@Table(name = "REL_SUBJECT_EXPERIMENTAL_GROUP")
public class RelSubjectExperimentalGroup implements Serializable, Comparable<RelSubjectExperimentalGroup> {
/** Subject */
@ManyToOne
@JoinColumn(name = "SUBJECT_ID", referencedColumnName = "SUBJECT_ID")
private Subject subject;
/** Experimental Group */
@ManyToOne
@JoinColumn(name = "EXPERIMENTAL_GROUP_ID", referencedColumnName = "EXPERIMENTAL_GROUP_ID")
private ExperimentalGroup experimentalGroup;
/** ID */
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "REL_SUBJECT_EXPERIMENTAL_GROUP_ID")
private long id;
...
Then, to edit a ExperimentalGroup, I have this in my JSF page:
<s:fragment>
<s:decorate id="relSubjectExperimentalGroupListDecorate" template="../template/editWithoutPassedImg.xhtml">
<ui:define name="label">#{msg['inrianeurotk.manageData.experimentalGroup.associated.subjects.associateNew']}:</ui:define>
<h:selectOneMenu id="selectSubject" tabindex="2" for="subject" value="#{experimentalGroupHome.currentSubject}">
<s:selectItems value="#{subjectList.completeResultList}" var="subject" label="#{subject.subjectIdentifier} - #{subject.name}" noSelectionLabel="#{msg['inrianeurotk.manageData.create.new.subject.choose']}" />
<s:convertEntity />
</h:selectOneMenu>
</s:decorate>
<a4j:commandLink action="#{experimentalGroupHome.addSubject()}" id="createSubject" value="#{msg['inrianeurotk.manageData.experimentalGroup.subject.add']}" reRender="createExperimentalGroupForm">
</a4j:commandLink>
</s:fragment>In my JSF page, I can select a subject from the subject list and click on a add
commandLink to add the subject to the collection of subjects of the current instance of ExeprimentalGroupHome.
That is to say, I call the method addSubject() of ExperimentalGroupHome :
@Name("experimentalGroupHome")
@Scope(ScopeType.CONVERSATION)
@Stateful
public class ExperimentalGroupHome extends EntityHome<ExperimentalGroup> implements IExperimentalGroupHome {
private Subject currentSubject;
public void addSubject() {
if (currentSubject != null) {
final RelSubjectExperimentalGroup relSubjectExperimentalGroup = new RelSubjectExperimentalGroup();
relSubjectExperimentalGroup.setSubject(currentSubject);
relSubjectExperimentalGroup.setExperimentalGroup(this.getInstance());
if (!this.getInstance().getRelSubjectExperimentalGroupList().contains(relSubjectExperimentalGroup)) {
this.getInstance().getRelSubjectExperimentalGroupList().add(relSubjectExperimentalGroup);
currentSubject.getRelSubjectExperimentalGroupList().add(relSubjectExperimentalGroup);
}
}
}
...
}What I want is to really add the subject when I click on the persist
button of my JSF page. Thus, the persist method of ExperimentalGroupHome is then called.
However, when I click on the Add
button (call to the addSubject() method), I can see in the logs that a new RelSubjectExperimentalGroup has been created and has been given an id.
I don't understand why the object RelSubjectExperimentalGroup is persisted! I don't call any method to do this.
Any help would be very appreciated.
Thanks in advance
Adrien