hibernate3第三章之关联映射

一、一对一单向关联:
1.@Id 主键

   @GeneratedValue  主键自增,默认AUTO应用数据库的生成策略(相当于XML中的native,如果是mysql则调用auto_increment,如果是Oracle则调用hibernate_sequence),还有TABLE:使用一个特定的数据库表格来保存主键 ,SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列(一般用ORACLE的时候用这个),IDENTITY:主键由数据库自动生成(主要是自动增长型) 一般用Mysql的时候用这个

2.@OneToOne 一对一映射

@JoinColumn(name="student_id") 在teacher表中加一个自定义名称为“student_id”的外键映射字段


<pre name="code" class="java">import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Student {
	private int id;
	private String name;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
 

import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private Student student;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	@OneToOne
	@JoinColumn(name="student_id")
	public Student getStudent() {
		return student;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	
}



二、一对一双向关联:

1. @OneToOne(mappedBy="student") :由另一方的student属性控制(准确的说应该是getStudent中的student控制,不过一般也没人去改这个名称)

 

import javax.persistence.*;


@Entity
public class Teacher {
private int id;
private String name;
private Student student;
@Id
@GeneratedValue
public int getId() {
return id;
}
public String getName() {
return name;
}
@OneToOne
@JoinColumn(name="student_id")
public Student getStudent() {
return student;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setStudent(Student student) {
this.student = student;
}

}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Entity
public class Student {
	private int id;
	private String name;
	private Teacher teacher;
	@OneToOne(mappedBy="student")
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


三、多对一单向关联:

1.@ManyToOne :多对一

2.@JoinColumn(name="teacherid"):在多这一方增加一个teacherid的外键关联字段(永远在多的一方加外键关联字段)

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
	private int id;
	private String name;
	private int age; 
	private Teacher teacher;
	@ManyToOne
	@JoinColumn(name="teacherid")
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private String title;
	private Date birthDate;
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
}

四、一对多单向关联:

import java.util.Date; 
import java.util.*;

import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private String title;
	private Date birthDate;
	private Set<Student> student=new HashSet<Student>();
	
	@OneToMany
	@JoinColumn(name="teacher_id")
	public Set<Student> getStudent() {
		return student;
	}
	public void setStudent(Set<Student> student) {
		this.student = student;
	}
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
}
import javax.persistence.*;
@Entity
public class Student {
	private int id;
	private String name;
	private int age;  
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}



五、多对一双向关联:

1.一对多、多对一的双向关联一样,值得注意的有两点 :

@ManyToOne没有mappedBy属性(其他OneToMany、OneToOne、ManyToMany都有MappedBy属性),所以只能在@OneToMany上加MappedBy属性

@JoinColumn(name="teacherid")加在哪一边都都可以,结果都一样

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
	private int id;
	private String name;
	private int age; 
	private Teacher teacher;
	@ManyToOne
	@JoinColumn(name="teacherid")
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private String title;
	private Date birthDate;
	private Set<Student> student=new HashSet<Student>();
	
	@OneToMany(mappedBy="teacher")
	public Set<Student> getStudent() {
		return student;
	}
	public void setStudent(Set<Student> student) {
		this.student = student;
	}
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
}

 六、多对多单向关联:

1.多对多关联会产生一张中间表,对中间表的设置使用@JoinTable,其中第一个参数name指定中间表的名称,第二个参数joincolumns指定多个外键关联字段,它的值是数组形式,这里只关联一个,就是本类在中间表中的外键名称,第三个参数是inverseJoinColumns反转设置多个外键关联字段,意思就是在本类设置另一个类在中间表中外键的名称,它的值也是数组类型,这里只设置一个外键。

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private String title;
	private Date birthDate;
	private Set<Student> student=new HashSet<Student>();
	
	@ManyToMany
	@JoinTable(name="t_s",
			joinColumns={@JoinColumn(name="teacher_id")},
			inverseJoinColumns={@JoinColumn(name="student_id")}
			)
	public Set<Student> getStudent() {
		return student;
	}
	public void setStudent(Set<Student> student) {
		this.student = student;
	}
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
}

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Student {
	private int id;
	private String name;
	private int age;  
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

七、多对多双向关联:

加一个MappedBy就行了。

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.*;

@Entity
public class Teacher {
	private int id;
	private String name;
	private String title;
	private Date birthDate;
	private Set<Student> student=new HashSet<Student>();
	
	@ManyToMany
	@JoinTable(name="t_s",
			joinColumns={@JoinColumn(name="teacher_id")},
			inverseJoinColumns={@JoinColumn(name="student_id")}
			)
	public Set<Student> getStudent() {
		return student;
	}
	public void setStudent(Set<Student> student) {
		this.student = student;
	}
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
}
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Student {
	private int id;
	private String name;
	private int age;  
	private Set<Teacher> teacher=new HashSet<Teacher>();
	@ManyToMany(mappedBy="student")
	public Set<Teacher> getTeacher() {
		return teacher;
	}
	public void setTeacher(Set<Teacher> teacher) {
		this.teacher = teacher;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}




3.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值