2013-05-13 139 views
0

好吧,所以我想得到映射组和学生在一张表中,但我有一个错误:“对象引用未保存的瞬态实例”。如果我添加级联到所有它会说这个对象已经存在。哪里不对 ?对象引用一个未保存的瞬态实例错误

下面是实体:

@Entity 
@Table(name = "listaosob") 
public class listaOsob implements Serializable { 

@Id 
@GeneratedValue 
private int id; 
private static final long serialVersionUID = 1L; 
@ManyToOne 
private Student student; 
@ManyToOne 
private Grupa grupa; 

@Entity 
@Table(name = "student") 
public class Student implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue 
private int id; 
private String imie; 
private String nazwisko; 
private String login; 
private String haslo; 
@Column(unique=true) 
private int nr_albumu; 
@Column(unique=true) 
private String kod_karty; 

@Entity 
@Table(name = "grupa") 
public class Grupa implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue 
private int id; 
private String nazwa; 
private Time godzina; 
private String sala; 
private String tydzien; 
@ManyToOne 
private Prowadzacy prowadzacy; 

EJB代码:

@Stateless 
@LocalBean 
public class StudentBean implements StudentBeanRemote, StudentBeanLocal { 

@PersistenceContext 
private EntityManager eM; 

public StudentBean() {} 

public void dodajStudenta(Student s) { 
    eM.persist(s); 
    eM.flush(); 
} 

public void usunStudenta(Student s) { 
    eM.remove(s); 
    eM.flush(); 
} 

@SuppressWarnings("unchecked") 
public ArrayList<Student> listaStudentow() { 
    Query query = eM.createQuery("SELECT e FROM student e"); 
    return (ArrayList<Student>) query.getResultList(); 
} 

@SuppressWarnings("unchecked") 
public ArrayList<Student> listaStudentow(Grupa grupa) { 
    Query query = eM.createQuery("SELECT e FROM listaosob e WHERE e.grupa = :grupa"); 
    query.setParameter("grupa", grupa); 
    return (ArrayList<Student>) query.getResultList(); 
} 

public void dodajGrupe(Grupa g) { 
    eM.persist(g); 
} 

public void usunGrupe(Grupa g) { 
    eM.remove(g); 
    eM.flush(); 
} 

public void dodajListeOsob(listaOsob l) { 
    eM.persist(l); 
} 

和一个示例性测试:

Student name1 = new Student("new"+gen.nextInt(),"nazwisko","log", "haslo", "asd"+gen.nextInt(), gen.nextInt()); 
      obj.dodajStudenta(name1); 
      Grupa n = new Grupa(); 
      obj.dodajGrupe(n); 
      listaOsob lista = new listaOsob(name1, n); 
      obj.dodajListeOsob(lista); 
+0

1)您提供的代码片段不完整,dodajListeOsob丢失。 2)是从容器托管代码中调用的示例测试代码? 3)哪一行会抛出“对象引用一个未保存的瞬态实例”以及哪一个“对象存在”? – 2013-05-13 23:06:19

+0

1)sory,我只是在底部添加方法: public void dodajListeOsob(listaOsob l){ \t eM.persist(l); } 2)示例从独立应用程序远程调用 3)obj.dodajListeOsob(lista);抛出错误但对象arleady存在只有当我添加cascade.ALL到@manytoone() – Gravian 2013-05-13 23:18:11

+0

它似乎工作,如果我从ID字段中删除@GeneratedValue。 – Gravian 2013-05-14 00:26:49

回答

0

dodajListeOsob抛出object references an unsaved transient instance

  • 因为listaOsob包含grupa@ManyToOne),这是不存在于数据库
  • grupa不存在于数据库中,因为dodajGrupe不做persist像其他方法做
  • dodajListeOsob不调用persist(在这种情况下,它不会引起任何问题)
+0

你说的是持续冲洗吗?即使我添加刷新到所有方法,对象仍然不会持续到数据库,它在瞬态状态,因为它等待得到生成的ID。如果这组持续,刷新不保存我应该做什么来立即坚持对象? – Gravian 2013-05-14 07:30:17

相关问题