"Detached entity passed to persist"

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

"Detached entity passed to persist"

Christopher Dodunski-4
Hi team,

I suspect you'll be able to answer this right off the top of your head, as
this error occurs in response to what I imagine is a very routine code
assignment: set a newly created user's company to be the same company as
that of the user doing the creating.


Code snippet from 'pages/user/CreateUser.java'...

    User user = new User(firstName, lastName, userName, email,
authenticator.encryptPassword(password));

    //Set the new user's company to the same as the creator's company
    user.setCompany(authenticator.getLoggedUser().getCompany());

    crudServiceDAO.create(user);


The User>>Company relationship, as defined in the User entity class...

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="COMPANY_ID")
    private Company company;


The Company>>User relationship, as defined in the Company entity class...

    @OneToMany(mappedBy="company", cascade=CascadeType.ALL)
    private Collection<User> users = new ArrayList<User>();


The USER table has a COMPANY_ID field, so I'd be expecting Hibernate to
create a new user with the same company ID as the user I have logged in
as.  Instead, Tapestry gives the following error...

    org.apache.tapestry5.runtime.ComponentEventException

    detached entity passed to persist: com.example.harbour.entities.Company


Why is this?  Appreciate your help.

Thanks,

Chris.


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: "Detached entity passed to persist"

Kalle Korhonen-2
Surprisingly, this (re-attaching a detached entity) is not a simple
problem. First of all, you need to be very careful about holding onto
entities in your session. It's too easy with JPA/Hibernate to accidentally
keep the whole query resultset in memory when you think you are holding
onto a single object (check with your jvisualvm). Second, since you are
using Hibernate, you can re-attach an entity with (the now deprecated
operation) session.lock(entity, LockMode.NONE), not absolutely sure how the
latest versions behave. I've written about it at
http://www.tynamo.org/tapestry-conversations+guide/, referencing this
stackoverflow issue about it:
https://stackoverflow.com/questions/912659/what-is-the-proper-way-to-re-attach-detached-objects-in-hibernate,
make sure you read all of it. Your best bet is to only store the company id
in the session and do a find() before setting the company (I know, it
defeats some of the perceived user benefits of using Hibernate/JPA).

Kalle


On Tue, Nov 28, 2017 at 7:55 PM, Christopher Dodunski <
[hidden email]> wrote:

> Hi team,
>
> I suspect you'll be able to answer this right off the top of your head, as
> this error occurs in response to what I imagine is a very routine code
> assignment: set a newly created user's company to be the same company as
> that of the user doing the creating.
>
>
> Code snippet from 'pages/user/CreateUser.java'...
>
>     User user = new User(firstName, lastName, userName, email,
> authenticator.encryptPassword(password));
>
>     //Set the new user's company to the same as the creator's company
>     user.setCompany(authenticator.getLoggedUser().getCompany());
>
>     crudServiceDAO.create(user);
>
>
> The User>>Company relationship, as defined in the User entity class...
>
>     @ManyToOne(cascade=CascadeType.ALL)
>     @JoinColumn(name="COMPANY_ID")
>     private Company company;
>
>
> The Company>>User relationship, as defined in the Company entity class...
>
>     @OneToMany(mappedBy="company", cascade=CascadeType.ALL)
>     private Collection<User> users = new ArrayList<User>();
>
>
> The USER table has a COMPANY_ID field, so I'd be expecting Hibernate to
> create a new user with the same company ID as the user I have logged in
> as.  Instead, Tapestry gives the following error...
>
>     org.apache.tapestry5.runtime.ComponentEventException
>
>     detached entity passed to persist: com.example.harbour.entities.
> Company
>
>
> Why is this?  Appreciate your help.
>
> Thanks,
>
> Chris.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>