Проблема CascadeType в отношении один ко многим - PullRequest
1 голос
/ 24 мая 2010

У меня есть два класса, которые имеют однонаправленное отношение «один ко многим» друг с другом.

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;
}

Я хочу сохранить предложение с набором FieldMapper в базе данных.Когда я использую CascadeType.ALL в своей OneToMany, я получаю эту ошибку:

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

, а когда я изменяю CascadeType на что-то другое, я получаю эту ошибку:

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

и вот гдеЯ сохраняю предложение:

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

и не использую сессию где-то еще.

в tx.commit(); строки бросают объясненные исключения.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 25 мая 2010

Первое исключение заставляет меня полагать, что это не проблема с вашими отображениями / сущностями, а с тем, как обрабатывается жизненный цикл объекта или сеанс Hibernate.

Являются ли FieldMappers, которые вы пытаетесь сохранитьпостоянный (в другой сессии)?Возможно, вам придется сначала отсоединить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...