Другой объект с таким же значением идентификатора уже был связан с ошибкой сеанса при сохранении
Возможный дубликат:
Spring + Hibernate: другой объект с тем же значением идентификатора уже был связан с сеансом
У меня были проблемы с моими спящими аннотациями. У меня двунаправленные отношения между двумя классами. Вот axtavt (спасибо axtavt):
@Entity
public class Receipt implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "receipt")
private List<Collection> collections;
...
}
@Entity
public class Collection implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name="ReceiptId")
private Receipt receipt;
...
}
Но когда я пытаюсь сохранить свою квитанцию со списком коллекций, используя:
Receipt r = new Receipt();
List<Collection> cols = new ArrayList<Collection>();
cols.add(new Collection());
r.setCollections(cols);
getHibernateTemplate().save(r);
Это генерирует эту ошибку:
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
at com.coa.acctreports.daoImp.AccountingReportsImpl.save(AccountingReportsImpl.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
но когда я изменяю это
session.merge(receipt)
он не имеет ошибок, но когда я проверяю свою базу данных, receiveId fk в таблице колллексов устанавливается на нуль... Любая помощь приветствуется. Спасибо ^_^...
1 ответ
mappedby
аннотация на Receipt
означает, что Collection
на самом деле является владельцем отношений, что явно не то, что вы хотели, так как у вас есть каскад на Receipt
,
Вы должны удалить mappedby
на Receipt
и следуйте этому примеру из документации по спящему режиму:
@Entity
public class Receipt implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="ReceiptId")
private List<Collection> collections;
...
}
@Entity
public class Collection implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name="ReceiptId",insertable=false,updatable=false)
private Receipt receipt;
...
}
Использование того же кода, который вы использовали выше, для сохранения должно работать.
Здесь есть дополнительная информация: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/