Hibernate注解方式多种映射

1、先介绍一对一的映射annotation(Man和Woman)

Man.java

<span style="font-size:14px;">package ray.one2one;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="_man") //制定数据库中Man实体对应的表名
public class Man {
	private int id;
	private String name;
	private Woman woman;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO) //strategy制定主键生成策略为自动,=native
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column(name="m_name") //制定数据库字段的名称
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@OneToOne(mappedBy="man") //mappedBy同样指定由对方来用外键维护关联关系,即在数据库中woman表中有外键
	public Woman getWoman() {
		return woman;
	}
	public void setWoman(Woman woman) {
		this.woman = woman;
	}
}
</span>
Woman.java

<span style="font-size:14px;">package ray.one2one;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="_woman")
public class Woman {
	private int id;
	private String name;
	private Man man;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	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;
	}
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="m_id") //指定外键的名字 为m_id
	public Man getMan() {
		return man;
	}
	public void setMan(Man man) {
		this.man = man;
	}
	
}
</span>


<span style="font-size:14px;">package ray.one2one;

import org.hibernate.Session;
import ray.util.SessionUtil;

public class Test {
	public static void main(String[] args) {
		Woman woman = new Woman();
		woman.setName("文苹");
		Man man = new Man();
		man.setName("雷盼");
		man.setWoman(woman);
		woman.setMan(man);
		Session session = SessionUtil.getSession();
		session.beginTransaction();
		
		session.save(woman);
		session.getTransaction().commit();
		session.close();
	}
}</span>

总结:数据库中外键在_woman表中

2、再看一对多的关系

Departs.java(一方)

<span style="font-size:14px;">package ray.many2one;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "_Departs")
public class Departs {
	private int d_id;
	private String d_name;
	// 维护一个set,方便业务查询,双向关联多方
	private Set<Employ> employs = new HashSet<Employ>();

	// 主键 :@Id    主键生成方式:strategy = "increment"
	//映射表中id这个字段,不能为空,并且是唯一的
	@Id
	@GenericGenerator(name = "generator", strategy = "increment")
	@GeneratedValue(generator = "generator")
	@Column(name = "id", nullable = false, unique = true)
	public int getD_id() {
		return d_id;
	}

	public void setD_id(int d_id) {
		this.d_id = d_id;
	}
	//映射表中name这个字段 ,长度是500
	@Column(name = "name", length = 500)
	public String getD_name() {
		return d_name;
	}

	public void setD_name(String d_name) {
		this.d_name = d_name;
	}
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "departs")
	public Set<Employ> getEmploys() {
		return employs;
	}

	public void setEmploys(Set<Employ> employs) {
		this.employs = employs;
	}

}
</span>
Employ.java(多方)

<span style="font-size:14px;">package ray.many2one;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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;

@Entity
@Table(name="_employ")
public class Employ {
	private int e_id;
	private String name;
	//维护一个一方,类似于数据库中的外键
	private Departs departs;
	@Id
	@GenericGenerator(name = "generator", strategy = "increment")
	@GeneratedValue(generator = "generator")
	@Column(name = "e_id", nullable = false, unique = true)
	public int getE_id() {
		return e_id;
	}
	public void setE_id(int e_id) {
		this.e_id = e_id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="d_id")
	public Departs getDeparts() {
		return departs;
	}
	public void setDeparts(Departs departs) {
		this.departs = departs;
	}
	
}
</span>

测试代码:

<span style="font-size:14px;">package ray.many2one;

import org.hibernate.Session;

import ray.util.SessionUtil;

public class Test {
	public static void main(String[] args) {
		Departs departs = new Departs();
		departs.setD_name("北京昌平");
		Employ e1 = new Employ();
		e1.setName("雷子诺");
		e1.setDeparts(departs);
		
		Employ e2 = new Employ();
		e2.setName("雷盼");
		e2.setDeparts(departs);
		departs.getEmploys().add(e1);
		departs.getEmploys().add(e2);
/*		employs.add(e1);
		employs.add(e2);
		
		departs.setEmploys(employs);*/
		Session session = SessionUtil.getSession();
		session.beginTransaction();
		session.save(departs);
		session.save(e1);
		session.save(e2);
		session.getTransaction().commit();
		session.close();
	}
}</span>


总结:数据库中外键在_employ表中

3、最后看多对多的关系

多对多这里通常有两种处理方式,一种是通过建立一张中间表,然后由任一一个多的一方来维护关联关系,另一种就是将多对多拆分成两个一对多的关联关系

这里介绍一种通过中间表由任一一个多的一方来维护关联关系

Course.java

<span style="font-size:14px;">package ray.many2many;

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

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

//多对多这里通常有两种处理方式,一种是通过建立一张中间表,然后由任一一个多的一方来维护关联关系,
//另一种就是将多对多拆分成两个一对多的关联关系
//1. 介绍用中间表来维护关系
@Entity
@Table(name = "_course")
public class Course {
	private int c_id;
	private String c_name;
	private Set<Student2> students = new HashSet<Student2>();

	public void addStudent(Student2 s) {
		this.getStudents().add(s);
	}

	/*
	 * 因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable
	 * 这个注解来声明,name就是指定了中间表的名字,JoinColumns是一个
	 * @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Course,所以在对方外键的名称就是
	 * c_id,inverseJoinColumns也是一个
	 * @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Student2,所以在我方外键的名称就是s)id
	 */
	@ManyToMany
	@JoinTable(name = "stu_course", joinColumns = { @JoinColumn(name = "c_id") }, inverseJoinColumns = { @JoinColumn(name = "stu_id") })
	public Set<Student2> getStudents() {
		return students;
	}

	public void setStudents(Set<Student2> students) {
		this.students = students;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public int getC_id() {
		return c_id;
	}

	public void setC_id(int c_id) {
		this.c_id = c_id;
	}

	public String getC_name() {
		return c_name;
	}

	public void setC_name(String c_name) {
		this.c_name = c_name;
	}

}
</span>

Student2.java

<span style="font-size:14px;">package ray.many2many;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="_student2")
public class Student2 {
	private int s_id;
	private String s_name;
	//增加set维护多对多关系
	private Set<Course> courses = new HashSet<Course>();
	
	@ManyToMany(mappedBy="students") //表示由Course方维护关系
	public Set<Course> getCourses() {
		return courses;
	}
	//增加一个方法,方便添加course
	public void addCourse(Course c){
		this.courses.add(c);
	}
	public void setCourses(Set<Course> courses) {
		this.courses = courses;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public int getS_id() {
		return s_id;
	}
	public void setS_id(int s_id) {
		this.s_id = s_id;
	}
	public String getS_name() {
		return s_name;
	}
	public void setS_name(String s_name) {
		this.s_name = s_name;
	}
}
</span>

测试代码:

<span style="font-size:14px;">package ray.many2many;

import org.hibernate.Session;

import ray.util.SessionUtil;

public class Test {
	public static void main(String[] args) {
		Student2 s1 = new Student2();
		s1.setS_name("s1");
		
		Student2 s2 = new Student2();
		s2.setS_name("s2");
		
		Course c1 = new Course();
		c1.setC_name("c1");
		
		Course c2 = new Course();
		c2.setC_name("c2");
		
//		s1.addCourse(c1);
//		s1.addCourse(c2);
//		
//		s2.addCourse(c1);
//		s2.addCourse(c2);
//		此处指明外键有student维护,所以只需要在course中添加student的引用即可
		c1.addStudent(s1);
		c1.addStudent(s2);
		
		c2.addStudent(s1);
		c2.addStudent(s2);
		
		Session session = SessionUtil.getSession();
		session.beginTransaction();
		session.save(s1);
		session.save(s2);
		session.save(c1);
		session.save(c2);
		session.getTransaction().commit();
		session.close();
	}
}
</span>


总结:通过hibernate来进行插入操作的时候,不管是一对多、一对一还是多对多,都只需要记住一点,在哪个实体类声明了外键,就由哪个类来维护关系,在保存数据时,总是先保存的是没有维护关联关系的那一方的数据,后保存维护了关联关系的那一方的数据










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了使用XML配置文件外,Hibernate还支持使用注解来进行实体映射和其他配置。使用注解可以简化Hibernate配置,并提供更直观的代码可读性。以下是一些常用的Hibernate注解: 1. @Entity:用于将Java类映射到数据库表。该注解应用在实体类上,表示该类是一个Hibernate实体。 2. @Table:用于指定实体类对应的数据库表名。可以在该注解中指定表名、模式、索引等。 3. @Id:用于指定实体类的主键属性。该注解应用在主键属性上。 4. @GeneratedValue:用于指定主键的生成策略。可以通过该注解指定主键自动生成的方式,如自增、UUID等。 5. @Column:用于指定实体类属性与数据库表字段之间的映射关系。可以在该注解中指定列名、数据类型、长度、约束等。 6. @OneToOne、@OneToMany、@ManyToOne、@ManyToMany:用于指定实体类之间的关联关系。这些注解可以在实体类属性上应用,表示一对一、一对多、多对一、多对多关系。 7. @JoinColumn:用于指定关联关系中的外键列。该注解应用在关联关系的拥有方的属性上。 8. @Transient:用于指定实体类属性不需要映射到数据库表字段。可以在需要忽略的属性上应用该注解。 9. @Enumerated:用于指定枚举类型的映射方式。可以在枚举类型的属性上应用该注解。 10. @Temporal:用于指定日期/时间类型的映射方式。可以在日期/时间类型的属性上应用该注解。 这些注解可以根据实际需求应用在实体类的属性、类级别上,或者关联关系的拥有方属性上,以实现实体映射、关联关系和其他配置。使用注解配置可以减少XML配置文件的复杂性,并提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值