ljx1619
2009-04-25 15:20
浏览 504
已采纳

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("王老师"))是可以实现插入的,到数据库表中看到主键是自动增长的。请问大家怎样才能自己定义主键值啊?谢谢大家不吝赐教了。
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • hantsy 2009-04-25 18:11
    已采纳

    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]

    点赞 评论
  • hantsy 2009-04-25 18:15
    1. 自己添加ID,最简单的就是使用hibernate扩展的功能,使用assigned策略
    点赞 评论

相关推荐 更多相似问题