`
lihengzkj
  • 浏览: 44127 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JPA初探02-继承关系和简单的一对多关系的注解实现

阅读更多

 【实例背景介绍】
两种实体类:
1. 学生类 StudenBean
 学生类下面有两个子类:体育特长生SportsStudentBean、艺术生PrintStudentBean
2. 班级类 ClazzBean

关系:
1. StudenBean 是 SportsStudentBean 和 PrintStudentBean 的父类
2. ClazzBean 和 StudenBean 是一对多的关系

 

【数据库表】

create table t_student(
 sid int primary key,
 sname varchar(45),
 clazzid int,
 studytype varchar(45),
 remark varchar(45)
);

 

create table t_clazz(
	classid int primary key,
	classname varchar(45)
);

【Java文件的设计】

【学生类】
package bean;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * 学生类
 * @author 青山
 * @date 2014年10月16日
 * @file name: StudentBean.java
 */
@Entity
@Table(name="t_student")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) //在顶级父类指定继承的策略是  单表记录所有的继承结构
@DiscriminatorColumn(name="studytype") //指定鉴别器  也就是怎么样鉴别是父类或者是子类,name指定标示子类额父类关系的列
@DiscriminatorValue("normal")  //指定鉴别器的值
public class StudentBean {
	@Id
	@Column(name="sid")
	private int stuId;
	
	@Column(name="sname")
	private String name;
	
	@ManyToOne(cascade=CascadeType.ALL)//当前实体和ClazzBean 的关系
	@JoinColumn(name="clazzid") //班级表的主键在当前学生表中的标示字段
	private ClazzBean clazz;
	
	
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public ClazzBean getClazz() {
		return clazz;
	}
	public void setClazz(ClazzBean clazz) {
		this.clazz = clazz;
	}
	
	
}
【体育特长生】 
package bean;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
 * 体育特长生
 * @author 青山
 * @date 2014年10月16日
 * @file name: SportsStudentBean.java
 */
@Entity
@DiscriminatorValue("sport")//指定鉴别器的值
public class SportsStudentBean extends StudentBean{
	@Column(name="remark")
	private String sport;

	public String getSport() {
		return sport;
	}

	public void setSport(String sport) {
		this.sport = sport;
	}
	
	
}

【艺术生】
package bean;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
 * 艺术生类
 * @author 青山
 * @date 2014年10月16日
 * @file name: PrintStudentBean.java
 */
@Entity
@DiscriminatorValue("print")//指定鉴别器的值
public class PrintStudentBean extends StudentBean{
	@Column(name="remark")
	private String print;

	public String getPrint() {
		return print;
	}

	public void setPrint(String print) {
		this.print = print;
	}
	
	
}

【班级类】
package bean;

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.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 班级类
 * @author 青山
 * @date 2014年10月16日
 * @file name: ClazzBean.java
 */
@Entity
@Table(name="t_clazz")
public class ClazzBean {
	@Id
	//设置主键生成策略为identity:由数据库自增长。选择这个策略必须要在数据库中设置主键自增长才行,Oracle不支持
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="classid")
	private int clazzId;
	
	@Column(name="classname")
	private String clazzName;
	
	//mappedBy="clazz"中的clazz是 当前实体在many一方的实体类中的字段名或者属性名
	@OneToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST},fetch=FetchType.LAZY,mappedBy="clazz") 
	private Set<StudentBean> set;
	
	public int getClazzId() {
		return clazzId;
	}
	public void setClazzId(int clazzId) {
		this.clazzId = clazzId;
	}
	public String getClazzName() {
		return clazzName;
	}
	public void setClazzName(String clazzName) {
		this.clazzName = clazzName;
	}
	public Set<StudentBean> getSet() {
		return set;
	}
	public void setSet(Set<StudentBean> set) {
		this.set = set;
	}
	
	
}

【测试类】

package com.jpa.test;

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

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import util.JPAManagerFactory;
import bean.ClazzBean;
import bean.PrintStudentBean;
import bean.SportsStudentBean;
import bean.StudentBean;

public class StudentTest {
	public static void main(String[] args) {
		EntityManager manager = JPAManagerFactory.getMFInstance().getManager();
		
//		addTest(manager);
		
		findTest(manager);
		
		
	}
	static void findTest(EntityManager manager){
		ClazzBean clazz = manager.find(ClazzBean.class,8);
		
		System.out.println(clazz.getClazzName());
		
		Set<StudentBean> set = clazz.getSet();
		for(StudentBean stu : set){
			System.out.println(stu.getName());
		}
	}
	static void addTest(EntityManager manager){
		//添加两个班级
				ClazzBean c1 = new ClazzBean();
				c1.setClazzName("高三一班");
				ClazzBean c2 = new ClazzBean();
				c2.setClazzName("高三二班");
				
				//添加3个学生
				StudentBean stu1 = new StudentBean();
				stu1.setClazz(c1);
				stu1.setName("张三");
				stu1.setStuId(1);
				
				SportsStudentBean stu2 = new SportsStudentBean();
				stu2.setClazz(c2);
				stu2.setName("李四");
				stu2.setStuId(2);
				stu2.setSport("basketball");
				
				PrintStudentBean stu3 = new PrintStudentBean();
				stu3.setClazz(c2);
				stu3.setName("王五");
				stu3.setStuId(3);
				stu3.setPrint("person print");
				//开启事务
				EntityTransaction t = manager.getTransaction();
				t.begin();
				//将学生添加到班级中去
				Set<StudentBean> set1 = new HashSet<StudentBean>();
				set1.add(stu1);
				Set<StudentBean> set2 = new HashSet<StudentBean>();
				set2.add(stu3);
				set2.add(stu2);
				
				c1.setSet(set1);
				c2.setSet(set2);
				//持久化班级
				manager.persist(c1);
				manager.persist(c2);
				
				
				t.commit();
				manager.close();
	}
}

 

原理的解说很少,我也是初学。感觉JPA的注解和hibernate的XML的配置文件差不多,如果有hibernate配置文件的基础的,只需要学习annotation的使用行了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics