Здравствуйте, Blazkowicz, Вы писали:
B>У вас целостность базы нарушена и это не должно приводить к фатальным последствиям??? Почему констрейнта на FK нет?
Констрейнта нет потому что в эту базу пишет внешнее приложение, контроля над которым нет и которое может записать невалидные (с точки зрения моей программы) данные. Короче говоря, таково, увы, условие задачи.
B>Хотелось бы все же увидеть полный текст ошибки, stacktrace и немного кода. Ибо ошибка Found two representations of same collection у меня с вашим A-B-C что-то не вяжется.
Код (синтетический пример), сорри за обьем:
1. Описание сущностей:
@Entity
@Table(name="A")
public static class A {
private String id;
private List<B> children;
public A(){}
@Column(name = "id")
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@OneToMany(mappedBy="parentId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<B> getChildren() {
return children;
}
public void setChildren(List<B> children) {
this.children = children;
}
}
@Entity
@Table(name="A1")
public static class B {
private String id;
private String parentId;
private C child;
public B(){
}
@Column(name = "id")
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Column(name = "parentid")
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="ID", referencedColumnName="ID", insertable = false, updatable = false)
public C getChild() {
return child;
}
public void setChild(C child) {
this.child = child;
}
}
@Entity
@Table(name = "A2")
public static class C {
private String id;
public C() {
}
@Column(name = "id")
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
2. Считывание экземпляра A:
public A getA(String id){
return (A) factory.getCurrentSession()
.createCriteria(A.class)
.add(Restrictions.eq("id", id))
.uniqueResult();
}
3. Фрагмент кода, бросающий исключение:
Transaction t = factory.getCurrentSession().beginTransaction();
try {
try{
getA("1");
} catch (Exception ex){
// Здесь ловим org.hibernate.ObjectNotFoundException: No row with the given identifier exists
}
t.commit();
} catch(Exception e){
// Здесь ловим исключение, описанное в п.4
}
4. Стектрейс:
org.hibernate.HibernateException: Found two representations of same collection: A.children
at org.hibernate.engine.Collections.processReachableCollection(Collections.java:153)
at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:37)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:138)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)