2013-05-13 50 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

相關問題