【实例背景介绍】
两种实体类:
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的使用行了。
相关推荐
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.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
通过以上步骤,我们可以在Spring Boot应用中利用Spring Data JPA和`JpaRepository`轻松实现对数据库的访问,大大简化了数据访问层的代码。在实际项目中,还可以结合`Pageable`接口进行分页查询,或者使用`...
总结而言,`hibernate-jpa-2.1-api-1.0.0.Final.jar`是Hibernate对JPA 2.1规范的实现,包含了丰富的持久化、查询、事务和多租户等功能。深入理解并熟练运用其中的API,能够帮助开发者构建高效、灵活的数据访问层,...
java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 或javax/persistence/entitylistener问题
本篇文章将重点围绕“hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...
2. **Hibernate JPA的扩展性**:Hibernate是JPA的一个实现,以其强大的功能和灵活性赢得了广泛认可。Hibernate JPA 2.0 API在JPA的基础上进一步提供了丰富的功能,包括事务管理、查询语言HQL和 Criteria API等。 3....
### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...
6. **关系映射**:包括一对一、一对多、多对一和多对多的关系,使用@OneToOne, @OneToMany, @ManyToOne 和 @ManyToMany 注解来定义。 7. **懒加载(Lazy Loading)**:一种优化策略,关联的对象在需要时才从数据库...
本篇文章将深入探讨如何在JPA中实现继承关系,这对于构建可扩展且结构化的数据模型至关重要。 在Java中,继承是面向对象编程的一个核心概念,允许一个类(子类)继承另一个类(父类)的属性和方法。在JPA中,继承...
Hibernate则是一个流行的ORM(对象关系映射)框架,它是JPA的一种实现,提供了丰富的功能和高度的灵活性。 在JPA中,**关联关系**是实体之间的一种关系,模仿了数据库中的表间关系。有四种主要的关联类型: 1. **...
总结来说,"springboot-jpa-activiti-bootstrap-master"项目是一个集成了SpringBoot、JPA和Activiti的实战案例,它涵盖了后端开发的多个重要环节,对于想要提升企业级应用开发能力的开发者来说,这是一个非常有价值...
在JPA中,单向一对多关系通常通过在多方实体上定义`@ManyToOne`注解,而在一方实体上定义`@OneToMany`注解来实现。`@OneToMany`注解用于一方实体,表示这个实体拥有多方实体的集合。而`@ManyToOne`注解则用在多方...
JPA支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些注解用于定义实体之间的关联,并可以配置关联的字段、级联操作等。 5. **查询操作** JPA...
**JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...
在Java Persistence API (JPA) ...通过这种方式,JPA允许我们在Java应用程序中轻松地处理数据库中的单向多对一关系,提高了开发效率,并简化了数据库操作。了解并熟练掌握这种关系映射对于进行高效的JPA编程至关重要。
Java Persistence API(JPA)是Java...理解并熟练掌握一对一、一对多和多对多关系映射对于使用JPA进行数据库操作至关重要。在实际开发中,根据业务需求选择合适的关系映射方式,可以极大地提高开发效率和代码可维护性。
3. `@ManyToOne`:多对一关系,多个实体对应另一个实体的单一实例。 4. `@ManyToMany`:多对多关系,多个实体可以关联多个其他实体,通常需要一个中间表来存储关系。 在实际应用中,JPA的关联映射不仅可以简化对象...