Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] colon object and then insert

Hello,

It looks like the cascade option is set to cascadePrivateParts. A->B is set to be privately owned, where as B->C might not be and so C will not be cloned. I noticed that
p.cascadeAllParts(); is commented out, have you tried that?


Best Regards,
Chris

luke2010 wrote:
Hi, I am having problems on colone object using eclipseLink objectcopyingPolicy.
I have an entity A with children entity B, and B have multiple children
entity C , D. Here is the roughly for the structure.
A has oneToMany relationship to B, and A has pk aId annotated as
generatedValue AUTO. B is annotated as privateOwned,
@OneToMany(mappedBy="a", cascade = ALL, targetEntity=B.class)

B has oneToMany relationship to C, and B has @EmbeddedId pk class which
including aId and bId, and C has @EmbeddedId pk class which include aId,
bId, cId

B has oneToMany relationship to D, D has @EmbeddedId pk class which
including aId and bId and dId. when using the snippet below to colon object and then persist it,
===================
		private EntityManagerFactory emf =
Persistence.createEntityManagerFactory("brancoch");
		private EntityManager em = emf.createEntityManager();
		
		// first step, tried to retrieve one existing one from Db
		A a = findAById(new String("10005699"));
		String xml = getXml(a);
		System.out.println(xml);
		
		// next step, colon A and then insert colonedA
		a = fromXml(xml);
		A colonedA = clone(a, em);
		em.getTransaction().begin();
		em.persist(colonedA);
		em.getTransaction().commit();
		
		
		-------------------------------------
		private A clone(A s, EntityManager em) {
		EntityManagerImpl eme = (EntityManagerImpl) em.getDelegate();
		Session session = eme.getSession();
		ObjectCopyingPolicy p = new ObjectCopyingPolicy();
		p.cascadePrivateParts();
		//p.setDepth(p.CASCADE_ALL_PARTS);
		//p.cascadeAllParts();
		
		s = (A) session.copyObject(s, p);
		return s;
	}
	
========================================================		
In the console, i can see that it clearly insert A , and B with differnt
newly generated value aId, but when inserting C, it throws error for
duplciate recorde insertion, because it still using the old aId instead of
the new one.
is that because I use @EmbeddedId pk class in C? If that is right, why it
works for class B?


Back to the top