JPA一对多实现插入的问题

 第一次到javaeye社区发帖提问,这社区真的不错,还请大家多多指教。

  进入正题,问题一,班级和学生是一对多的关系,自己已经通过JPA注解实现了它们的一对多关系,并且生成数据库表也是正确的。tab_student表有三个字段,student_id(主键),student_name,banji_id(外键),而tab_banji表中有banji_id(主键)和banji_name两个字段,我现在的想法是实现插入学生到某个班去,请问怎样才能实现?

  还有一个问题,就是我通过注解设置的主键生成策略是auto类型的话,自己不能定义主键值吗?举个例子,现在有个tab_teacher表,它有2个字段,分别是teacher_id和teacher_name,现在我用persist(new Teacher(1,"王老师"))这样插入报错,但是我在实体中加个只有teacher_name属性的构造方法,也就是用persist(new Teacher("王老师"))是可以实现插入的,到数据库表中看到主键是自动增长的。请问大家怎样才能自己定义主键值啊?谢谢大家不吝赐教了。

1.比较简单,已经理解了jpa一对多的关系。
你可以同时保存班级和学生。如
[code="java"]
public class StudClass implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "cls")
private List students=new ArrayList();

public StudClass(){}
public StudClass(String name){
this.name=name;
}
// seter and getters
// equlas and hashcode 方法实现

public void addStudent(Student s){
this.students.add(s);
s.setCls(this);
}

}

[/code]
[code="java"]
public class Student implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;

@ManyToOne
private StudClass cls;

public Student(){}
public Student(String name){
this.name=name;
}
// seter and getters
// equlas and hashcode 方法实现

}

[/code]
上面代码略去了 setter和getter 方法,equals 和 hashcode 方法的实现,你可以使用IDE 实现。

使用时,一个事务中可以这样做
[code="java"]
StudClass c=new StudClass("一班");
Student s1=new Student("同学1");
Student s2=new Student("同学2");

c.addStudent(s1);
c.addStudent(s2);

em.persist(c);

[/code]
也可以单独添加一个学生到班级中。
[code="java"]
StudClass c=em.find(StudClass.class, id);
Student s1=new Student("同学1");
c.addStudent(s1);

[/code]
也可以单独更新Student
[code="java"]
StudClass c=em.getReference(StudClass.class, id);
Student s1=new Student("同学1");
s1.setCls(c);
em.persist(s1;
[/code]

  1. 自己添加ID,最简单的就是使用hibernate扩展的功能,使用assigned策略