hibernate 注解配置一对多关系简单实例
来源:互联网 发布:淘宝网咖啡机 编辑:程序博客网 时间:2024/06/01 09:06
hibernate 注解配置一对多关系
1.数据库:oracle数据库,有person和address二张表,一对多的关系。
数据库:
create table person ( id number(4) not null, uname varchar (20) ); create table address ( id number(4) not null, address varchar(20) not null, personId number(4) not null ) alter table person add constraint primary_id parmary key(id) deferrable initially deferred;
2.Person实体类:
package com.zengguo.po;import java.io.Serializable;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;import javax.persistence.Table;import org.hibernate.annotations.Fetch;import org.hibernate.annotations.FetchMode;import org.hibernate.annotations.GenericGenerator;import org.hibernate.annotations.Parameter;@SuppressWarnings(“serial”)@Entity@Table(name = “person”)public class Person implements Serializable {//oracle 序列@Id@GenericGenerator(name = “personGenericGenerator”, strategy = “sequence”,parameters = { @Parameter(value = “hibernate_seq”, name = “sequence”) })@GeneratedValue(generator=”personGenericGenerator”)private long id;@Column(name=”uname”)private String uname;@OneToMany(targetEntity=Address.class,cascade=CascadeType.ALL)@Fetch(FetchMode.JOIN)//updatable=false很关键,如果没有它,在级联删除的时候就会报错(反转的问题)@JoinColumn(name=”personId”,updatable=false)private Set<Address> sets = new HashSet<Address>();public Set<Address> getSets() {return sets;}public void setSets(Set<Address> sets) {this.sets = sets;}public Person() {super();}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}}
3.Address实体类
package com.zengguo.po;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;import org.hibernate.annotations.Parameter;@SuppressWarnings(“serial”)@Entity@Table(name = “address”)public class Address implements java.io.Serializable {//使用序列生成主键@Id@GenericGenerator(name = “addressGenericGenerator”, strategy = “sequence”,parameters = { @Parameter(value = “hibernate_seq”, name = “sequence”) })@GeneratedValue(generator = “addressGenericGenerator”)private long id;@Column(name = “address”)private String address;//多对一,@JoinColumn与@column类似,指定映射的数据库字段@ManyToOne(targetEntity = Person.class)@JoinColumn(name=”personId”,updatable=false)private Person person;public Address() {super();}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}
hibernate一对多mappedBy的用法:(班级classes和学生student,一对多的关系)
package oneToMany; import java.util.Set; import javax.persistence.*; /* 注意导入时,是导入:import javax.persistence.*; 非导入org.hibernate的相关类:import org.hibernate.annotations.Entity; */ @Entity @Table(name="classes") public class Classes implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String name; @OneToMany(cascade=CascadeType.ALL,mappedBy="classes") private Set<Student> students; //getter,setter省略 } package oneToMany; import javax.persistence.*; @Entity @Table(name="student") public class Student implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int sid; private String sname; //若有多个cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE} @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name="classid") //student类中对应外键的属性:classid private Classes classes; //getter,setter省略 } public class TestOneToMany { /* CREATE TABLE student ( --要定义外键!!!!!!! `sid` double NOT NULL auto_increment, `classid` double NULL, `sname` varchar(255) NOT NULL, PRIMARY KEY (sid), INDEX par_ind (classid), FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB */ public static void main(String[] args) throws SQLException { try { SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); /*因为mappedBy是定义在classes中,即classes类不负责维护级联关系.即维护者是student.所以,1.要将clsses的数据,赋给student,即用student的setClasses()方法去捆定class数据;2.在进行数据插入/更新session.save()/session.update()时,最后操作的是student.*/ Classes classes=new Classes(); classes.setName("access"); Student st1=new Student(); st1.setSname("jason"); st1.setClasses(classes); session.save(st1); Student st2=new Student(); st2.setSname("hwj"); st2.setClasses(classes); session.save(st2); tx.commit();/* 输出如下:Hibernate: insert into classes (name) values (?)Hibernate: insert into student (classid, sname) values (?, ?)Hibernate: insert into student (classid, sname) values (?, ?)*//*因为一端维护关系另一端不维护关系的原因,我们必须注意避免在应用中用不维护关系的类(class)建立关系,因为这样建立的关系是不会在数据库中存储的。如上的代码倒过来,则插入时,student的外键值为空.如下:*/// Student st1=new Student(); // st1.setSname("jason"); // session.save(st1); // // Student st2=new Student(); // st2.setSname("hwj"); // session.save(st2); // // Set<Student> students=new HashSet<Student>(); // students.add(st1); // students.add(st2); // // Classes classes=new Classes(); // classes.setName("access"); // classes.setStudents(students); // session.save(classes); /*输出如下:Hibernate: insert into student (classid, sname) values (?, ?)Hibernate: insert into student (classid, sname) values (?, ?)Hibernate: insert into classes (name) values (?)*/ } catch(HibernateException e) { e.printStackTrace(); } } }
0 0
- hibernate 注解配置一对多关系简单实例
- hibernate 注解配置一对多关系简单实例
- hibernate 注解配置一对多关系
- hibernate 注解配置一对多关系
- hibernate 注解配置一对多关系
- Hibernate一对多双向注解配置实例
- Hibernate 一对多注解 实例
- Hibernate 一对多注解 实例
- hibernate配置一对多关系
- hibernate配置一对多关系
- Hibernate 关系映射注解详解--一对多
- HIBERNATE一对多配置实例
- hibernate一对多注解开发实例
- Hibernate关系映射----单向一对多实例
- Hibernate 注解单向一对多配置
- hibernate注解配置一对多,分类表
- Hibernate 注解单向一对多配置
- Hibernate一对多关系的配置
- linux命令行大全
- Tomcat的目录结构详解
- C++运算符重载(10) - 智能指针
- 02-线性结构2. Reversing Linked List (25)
- ACM-1的个数
- hibernate 注解配置一对多关系简单实例
- 浅谈java学习--针对JAVA初学者的建议
- 背包整理模板
- [前端] JS实现文件下载
- Fedora10虚拟机上网:桥接方式
- iOS 7使用boundingRectWithSize
- Android中利用shape定制控件边框
- ACM-两点距离
- Android自动化压力测试图解教程——Monkey工具