openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Patrick Linskey" <plins...@gmail.com>
Subject Re: How to PERSIST object without loading references?
Date Thu, 03 Apr 2008 17:31:55 GMT
Hi,

EntityManager.getReference() is your friend here.

-Patrick

On Thu, Apr 3, 2008 at 4:19 AM, Ognjen Blagojevic <ognjen@etf.bg.ac.yu> wrote:
> 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 "mypackage.Department@18952cc" 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
>



-- 
Patrick Linskey
202 669 5907

Mime
View raw message