Hi all,

Is there a way to persist an Entity without loading all the referenced objects?

I know that this is possible:

Employee e = new Employe();
e.setName("John Doe");
e.setIdDepartment(findDepartmentByPrimaryKey(idDept));
e.setIdRank(findRankByPrimaryKey(idRank));
// and so on
em.persist(e);

But if I have a lot of references, and lot of INSERTS to do, this becames import with poor performace (before each INSERT statemet app must execute N selects).

It would be much faster if I can set references without looking them up:

Employee e = new Employe();
e.setName("John Doe");
Department dept = new Department();
dept.setIdDepartment(idDept);
e.setIdDepartment(dept);
// and so on
em.persist(e);

(Please note here: I'm not trying to insert new department, but rather to set a reference to existing one without looking it up in the database.)

But this seems impossible. Without CascadeType.PERSIST it throws something like:

<openjpa-1.0.2-r420667:627158 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: Encountered unmanaged object "[EMAIL PROTECTED]" in persistent field "mypackage.Employee.idDepartment" of managed object "mypackage.Employee-5" during flush. However, this field does not allow to be CascadeType.PERSIST. You cannot flush unmanaged objects.

Ok, I add the CascadeType.PERSIST, and then:

org.apache.openjpa.persistence.InvalidStateException: The generated value processing detected an existing value assigned to this field: mypackage.Department.idDepartment. This existing value was either provided via an initializer or by calling the setter method. You either need to remove the @GeneratedValue annotation or modify the code to remove the initializer processing.


It must be a way to INSERT objects in the database without looking up for all the references, but I am not able to find it.

Regards,
Ognjen

Reply via email to