Hibernate 一对多注解 mappedby的作用。
package oneToMany;
2 import java.util.Set;
3 import javax.persistence.*;
4 /*
5 注意导入时,是导入:import javax.persistence.*;
6 非导入org.hibernate的相关类:import org.hibernate.annotations.Entity;
7 */
8 @Entity
9 @Table(name=”classes”)
10 public class Classes implements Serializable {
11 @Id
12 @GeneratedValue(strategy=GenerationType.AUTO)
13 private int id;
14 private String name;
15
16 @OneToMany(cascade=CascadeType.ALL,mappedBy=”classes”)
17 private Set<Student> students;
18 //getter,setter省略
19 }
20
21
22 package oneToMany;
23 import javax.persistence.*;
24 @Entity
25 @Table(name=”student”)
26 public class Student implements Serializable {
27 @Id
28 @GeneratedValue(strategy=GenerationType.AUTO)
29 private int sid;
30
31 private String sname;
32
33 //若有多个cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE}
34 @ManyToOne(cascade={CascadeType.ALL})
35 @JoinColumn(name=”classid”) //student类中对应外键的属性:classid
36 private Classes classes;
37 //getter,setter省略
38 }
39
40
41 public class TestOneToMany {
42 /*
43 CREATE TABLE student ( –要定义外键!!!!!!!
44 `sid` double NOT NULL auto_increment,
45 `classid` double NULL,
46 `sname` varchar(255) NOT NULL,
47 PRIMARY KEY (sid),
48 INDEX par_ind (classid),
49 FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE
50 ) ENGINE=InnoDB
51 */
52 public static void main(String[] args) throws SQLException
53 {
54 try
55 {
56 SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
57 Session session=sf.openSession();
58 Transaction tx=session.beginTransaction();
59 /*
60 因为mappedBy是定义在classes中,即classes类不负责维护级联关系.即维护者是student.所以,
61 1.要将clsses的数据,赋给student,即用student的setClasses()方法去捆定class数据;
62 2.在进行数据插入/更新session.save()/session.update()时,最后操作的是student.
63 */
64 Classes classes=new Classes();
65 classes.setName(“access”);
66
67 Student st1=new Student();
68 st1.setSname(“jason”);
69 st1.setClasses(classes);
70 session.save(st1);
71
72 Student st2=new Student();
73 st2.setSname(“hwj”);
74 st2.setClasses(classes);
75 session.save(st2);
76 tx.commit();
77 /*
78 输出如下:
79 Hibernate: insert into classes (name) values (?)
80 Hibernate: insert into student (classid, sname) values (?, ?)
81 Hibernate: insert into student (classid, sname) values (?, ?)
82 */
83 /*
84 因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类(class)建立关系,因为这样建立的关系是不会在数据库中存储的。
85 如上的代码倒过来,则插入时,student的外键值为空.如下:
86 */
87 // Student st1=new Student();
88 // st1.setSname(“jason”);
89 // session.save(st1);
90 //
91 // Student st2=new Student();
92 // st2.setSname(“hwj”);
93 // session.save(st2);
94 //
95 // Set<Student> students=new HashSet<Student>();
96 // students.add(st1);
97 // students.add(st2);
98 //
99 // Classes classes=new Classes();
100 // classes.setName(“access”);
101 // classes.setStudents(students);
102 // session.save(classes);
103 /*
104 输出如下:
105 Hibernate: insert into student (classid, sname) values (?, ?)
106 Hibernate: insert into student (classid, sname) values (?, ?)
107 Hibernate: insert into classes (name) values (?)
108 */
109 }
110 catch(HibernateException e)
111 {
112 e.printStackTrace();
113 }
114 }
115 }