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

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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献