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

164 views
Skip to first unread message

Ivan B

unread,
Feb 12, 2008, 6:31:19 PM2/12/08
to Java Web Application
Hi,

I have 3 classes defined as such (I am leaving out getters and
setters:

@Entity
@Table(name = "ClassA")
public class ClassA {
@Id
@GeneratedValue
@Column(name = "CLASSA_ID")
private long id;

private String data;

@org.hibernate.annotations.CollectionOfElements
@JoinTable(name = "CLASSA_MEMBERS", joinColumns = @JoinColumn(name =
"CLASSA_ID"))
private Set<ClassB> children = new HashSet<ClassB>(0);

@org.hibernate.annotations.CollectionOfElements
@JoinTable( name = "CLASSC_MEMBERS", joinColumns = @JoinColumn(name =
"CLASSA_ID"))
@Cascade( {org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.PERSIST} )
private Set<ClassC> children2 = new HashSet<ClassC>(0);
}

@Embeddable
public class ClassB {
@Parent
private ClassA parent;

private String data;
}

@Entity
@Table(name = "ClassC")
public class ClassC {

@Id
@GeneratedValue
@Column(name = "CLASSC_ID")
private long id;

private String data;
}

If I execute this code I get the above (re: subject) error.

@Test
public void testCreateClassA() {
Random rnd = new Random();
Transaction tx = session.beginTransaction();

Set<ClassB> set = new HashSet<ClassB>(0);
for (int i = 0; i < 10; i++) {
ClassB child = new ClassB(String.valueOf(i));
set.add(child);
}

Set<ClassC> set2 = new HashSet<ClassC>(0);
for (int i = 0; i < 10; i++) {
ClassC child = new ClassC(String.valueOf(i));
set2.add(child);
// session.save(child);
}

ClassA clazz = new ClassA(String.valueOf(rnd.nextInt()), set);
clazz.setChildren2(set2);
session.save(clazz);
tx.commit();
}


If I remove the commented out line in my @Test everything works fine.
Why do I have to do this? I thought that @Cascade annotation should
take care of the problem?
Reply all
Reply to author
Forward
0 new messages