对象引用一个未保存的瞬态实例错误
问题描述:
好吧,所以我想得到映射组和学生在一张表中,但我有一个错误:“对象引用未保存的瞬态实例”。如果我添加级联到所有它会说这个对象已经存在。哪里不对 ?对象引用一个未保存的瞬态实例错误
下面是实体:
@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);
答
dodajListeOsob
抛出object references an unsaved transient instance
- 因为
listaOsob
包含grupa
(@ManyToOne
),这是不存在于数据库 -
grupa
不存在于数据库中,因为dodajGrupe
不做persist
像其他方法做 - 也
dodajListeOsob
不调用persist
(在这种情况下,它不会引起任何问题)
+0
你说的是持续冲洗吗?即使我添加刷新到所有方法,对象仍然不会持续到数据库,它在瞬态状态,因为它等待得到生成的ID。如果这组持续,刷新不保存我应该做什么来立即坚持对象? – Gravian 2013-05-14 07:30:17
1)您提供的代码片段不完整,dodajListeOsob丢失。 2)是从容器托管代码中调用的示例测试代码? 3)哪一行会抛出“对象引用一个未保存的瞬态实例”以及哪一个“对象存在”? – 2013-05-13 23:06:19
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
它似乎工作,如果我从ID字段中删除@GeneratedValue。 – Gravian 2013-05-14 00:26:49