[jboss-user] [EJB 3.0] - Very Weird, Triplicated childs at runtime, all ok in the DB

raistlinmolina do-not-reply at jboss.com
Thu Sep 21 05:05:35 EDT 2006


Hello, I have (among other entities) one parent Entity called reportInstance and one child Entity Called reportParameterValue, the relation is OneToMany.

I have a strange problem that arised becauce I couldn't delete a parent object, when I tired to delete it's child I couldn't either.

Then I noticed that when I asked the parent for its childs I got them triplicated, all is ok in the database (childs not triplicated).

The child was a weak entity, having its PK formed by the PK of two tables, when I noticed this problem I tried:

*Adding an id filed as PK, now the child Entoty has it own pk (the former fileds forming the pk remain as Foreign Keys).
        This didn't solve the problem, I couldn't delete anythimg and still got triplicated entries.

*Mapping the relationship in both sides, at first I had only mapped it at the  Parent side as I didn't want to know a parent from the child.
This has solved the deletion problem but I still have triplicated childs!!!

I copy code snippets below:


The relation at ReportParameterValueEJB.java (the child)

	@ManyToOne (targetEntity = ReportInstanceEJB.class, fetch = FetchType.EAGER)
  | 	@JoinColumn (name = "idReportInstance", insertable=false, updatable=false)
  | 	public ReportInstanceEJB getReportInstance(){
  | 		return this.reportInstance;
  | 	}
  | 	
  | 	public void setReportInstance(ReportInstanceEJB reportInstance){
  | 		this.reportInstance = reportInstance;
  | 		this.idReportInstance = reportInstance.getId();
  | 	}
  | 

The relation at ReportInstanceEJB.java (the parent)

   /**
  |     * Returns the value of the <code>reportParameterValue</code> relation property.
  |     *
  |     * @return the value of the <code>reportParameterValue</code> relation property.
  |     */
  |    @OneToMany(mappedBy="reportInstance", cascade= CascadeType.MERGE, fetch = FetchType.EAGER)
  |    public Collection <ReportParameterValueEJB>  getReportParameterValues(){
  |       return parameterValues;
  |    }
  | 
  |    /**
  |     * Sets the value of the <code>reportParameterValue</code> relation property.
  |     *
  |     * @param parameters a value for <code>reportParameterValue</code>.
  |     */
  |    public void setReportParameterValues(Collection <ReportParameterValueEJB> parameters) {
  |       this.parameterValues = parameters;
  |    }

And now the traces I'm getting in the JBoss console:

10:36:57,612 INFO  [STDOUT] Number of values:9
  | 10:36:57,612 INFO  [STDOUT] predelete: 10; 10; 2; 27
  | 10:36:57,628 INFO  [STDOUT] postdelete: 27
  | 10:36:57,628 INFO  [STDOUT] predelete: 10; 10; 2; 27
  | 10:36:57,628 INFO  [STDOUT] postdelete: 27
  | 10:36:57,628 INFO  [STDOUT] predelete: 10; 10; 2; 27
  | 10:36:57,628 INFO  [STDOUT] postdelete: 27
  | 10:36:57,628 INFO  [STDOUT] predelete: 12; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | 10:36:57,628 INFO  [STDOUT] predelete: 12; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | 10:36:57,628 INFO  [STDOUT] predelete: 12; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | 10:36:57,628 INFO  [STDOUT] predelete: 13; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | 10:36:57,628 INFO  [STDOUT] predelete: 13; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | 10:36:57,628 INFO  [STDOUT] predelete: 13; 10; 2; 45
  | 10:36:57,628 INFO  [STDOUT] postdelete: 45
  | ##########################################
  | 10:42:59,471 INFO  [STDOUT] Number of values:3
  | 10:42:59,471 INFO  [STDOUT] predelete: 16; 15; 2; 27
  | 10:42:59,471 INFO  [STDOUT] postdelete: 27
  | 10:42:59,471 INFO  [STDOUT] predelete: 16; 15; 2; 27
  | 10:42:59,471 INFO  [STDOUT] postdelete: 27
  | 10:42:59,471 INFO  [STDOUT] predelete: 16; 15; 2; 27
  | 10:42:59,471 INFO  [STDOUT] postdelete: 27

I explain the trace:
10:42:59,471 INFO  [STDOUT] predelete: 16; 15; 2; 27
I call a println with: the childs id (PK) - 16, the childs FK to the report - 15 the childs id to another parent table - 2, and another field containing its value - 27
Then I call manager.remove(child);
and call an println with just its value just to make sure it was deleted without exceptiosn inside.

10:42:59,471 INFO  [STDOUT] postdelete: 27

Here I deleted two different ReportInstances, id=10, and id=15 respectively.
Id=10 had 3 actual childs, and in the trace it says that it has nine
Id=15 had 1 actual child, and in the trace it says that it has three


The code at the agentBean that performs the ReportInstance deletion is:

	public void deleteReportInstance(ReportInstanceEJB reportInstance) {
  | 		Collection <ReportParameterValueEJB> values = reportInstance.getReportParameterValues();
  | 		Iterator <ReportParameterValueEJB> valuesIt = values.iterator();
  | 		System.out.println("Number of values:" + values.size());
  | 		while (valuesIt.hasNext()){
  | 			ReportParameterValueEJB value = valuesIt.next();
  | 			System.out.println("predelete: " + value.getId()+"; "+ value.getIdReportInstance()+"; "+ value.getIdParameter()+"; "+value.getValue());
  | 			manager.remove(value);
  | 			System.out.println("postdelete: " + value.getValue());
  | 		}
  | 		
  | 		manager.remove(reportInstance);
  | 	}

I get one instance in the client, get a reference to the agentbean and ask it  to delete the reportInstance as show above.

I have checked the database and I had only one child for reportInstance 10 and three for instance 15.

What's happening???


Thanks in advance

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3973190#3973190

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3973190



More information about the jboss-user mailing list