Ir a la página principal de Grupos de Google    Java Web Application
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing:

Ivan B <ibo...@gmail.com>

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?