views:

63

answers:

1

Hi

I have two classes which have a Unidirectional One to Many relation with each other.

public class Offer{
    ...
    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "Offer_Fields",
    joinColumns =
    @JoinColumn(name = "OFFER_ID"),
    inverseJoinColumns =
    @JoinColumn(name = "FIELDMAPPER_ID"))
    private Set<FieldMapper> fields = new HashSet<FieldMapper>();
}


@Entity
@Table(name = "FieldMapper")
public class FieldMapper implements Serializable {
   @Id
   @Column(name = "FIELDMAPPER_ID")
   @GeneratedValue
   private int id;
   @OneToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "multilingual_field_fk")
   private MultiLingual field;
   @OneToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "multilingual_value_fk")
   private MultiLingual value;
}

I want to store an Offer with a set of FieldMapper to database. When I Use CascadeType.ALL in my OneToMany, I got this error:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

and when I change CascadeType to something else I got this error:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.RCSTT.library.FieldMapper

and here is where I save Offer :

public void insert(Offer offer) throws SQLException {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.save(offer);
    tx.commit();
    session.close();
}

and I don't use session in somewhere else.

in tx.commit(); line throws explained exceptions.

Thanks for your help.

A: 

The first exception leads me to believe that this is not a problem with your mapping/entities but with how the object lifecycle or Hibernate session is handled.

Are the FieldMappers that you're trying to save already persistent (in another session)? You might need to detach those first.

No, they just created in java code when I want to save Offer. They are not persistent, so when I change cascadeType to something else, I got this : "object references an unsaved transient instance". it means they are not persistent.
Milad.KH
How is your hibernate session handled? This exception can occur if the collection (fields) is associated with two open sessions at the same time.So, if you for example lookup an Offer using one session and then try to save the same Offer using a different session this exception will occur.
No, Offer is also created in code. What do you mean about How is hibernate session handled ?
Milad.KH
Odd.I mean how you create it and if you reuse it between requests and so on..
I'm afraid I have no more ideas :(