【实例背景介绍】
两种实体类:
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的使用行了。
相关推荐
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
SpringDataJpa开发--继承JpaRepository实现简单条件查询示例代码
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.final.jar.zip,内含hibernate-jpa-2.1-api-1.0.0.final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
jpa--10.单向一对多jpa--10.单向一对多jpa--10.单向一对多jpa--10.单向一对多jpa--10.单向一对多jpa--10.单向一对多
java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 或javax/persistence/entitylistener问题
jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一
hibernate-jpa-2.0-api-1.0.1.Final-sources
hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip的源代码
java运行依赖jar包
上次简单介绍了JPA的基本部署和操作过程,算是认识JPA了,下面我们继续学习JPA吧,我们从JPA的注解标记@Table和@Column开始逐渐介绍。
springboot-jpa-activiti-bootstrap-master。springboot是2 activity是6
jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多jpa--11.双向一多
jpa-e-hibernate-1a-edicao