`
lihengzkj
  • 浏览: 45149 次
  • 性别: 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的使用行了。

 

分享到:
评论

相关推荐

    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-sources.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规范的实现库,它使得开发者能够使用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.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    SpringDataJpa开发--继承JpaRepository实现简单条件查询

    通过以上步骤,我们可以在Spring Boot应用中利用Spring Data JPA和`JpaRepository`轻松实现对数据库的访问,大大简化了数据访问层的代码。在实际项目中,还可以结合`Pageable`接口进行分页查询,或者使用`...

    hibernate-jpa-2.1-api-1.0.0.Final.jar

    总结而言,`hibernate-jpa-2.1-api-1.0.0.Final.jar`是Hibernate对JPA 2.1规范的实现,包含了丰富的持久化、查询、事务和多租户等功能。深入理解并熟练运用其中的API,能够帮助开发者构建高效、灵活的数据访问层,...

    hibernate-jpa-2.0-api-1.0.0-CR-1.jar

    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-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...

    hibernate-jpa-2.0-api-1.0.1.Final-sources

    2. **Hibernate JPA的扩展性**:Hibernate是JPA的一个实现,以其强大的功能和灵活性赢得了广泛认可。Hibernate JPA 2.0 API在JPA的基础上进一步提供了丰富的功能,包括事务管理、查询语言HQL和 Criteria API等。 3....

    JPA学习笔记-EJB-02JPA属性注解

    ### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...

    hibernate-jpa-2.1-api 1.0.0.Final API

    6. **关系映射**:包括一对一、一对多、多对一和多对多的关系,使用@OneToOne, @OneToMany, @ManyToOne 和 @ManyToMany 注解来定义。 7. **懒加载(Lazy Loading)**:一种优化策略,关联的对象在需要时才从数据库...

    JPA 实现继承关系

    本篇文章将深入探讨如何在JPA中实现继承关系,这对于构建可扩展且结构化的数据模型至关重要。 在Java中,继承是面向对象编程的一个核心概念,允许一个类(子类)继承另一个类(父类)的属性和方法。在JPA中,继承...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    Hibernate则是一个流行的ORM(对象关系映射)框架,它是JPA的一种实现,提供了丰富的功能和高度的灵活性。 在JPA中,**关联关系**是实体之间的一种关系,模仿了数据库中的表间关系。有四种主要的关联类型: 1. **...

    springboot-jpa-activiti-bootstrap-master

    总结来说,"springboot-jpa-activiti-bootstrap-master"项目是一个集成了SpringBoot、JPA和Activiti的实战案例,它涵盖了后端开发的多个重要环节,对于想要提升企业级应用开发能力的开发者来说,这是一个非常有价值...

    jpa--10.单向一对多

    在JPA中,单向一对多关系通常通过在多方实体上定义`@ManyToOne`注解,而在一方实体上定义`@OneToMany`注解来实现。`@OneToMany`注解用于一方实体,表示这个实体拥有多方实体的集合。而`@ManyToOne`注解则用在多方...

    jpa的学习---jpa demo工程

    JPA支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些注解用于定义实体之间的关联,并可以配置关联的字段、级联操作等。 5. **查询操作** JPA...

    JPA一对多和多对一关系

    **JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...

    jpa--9.单向多对一

    在Java Persistence API (JPA) ...通过这种方式,JPA允许我们在Java应用程序中轻松地处理数据库中的单向多对一关系,提高了开发效率,并简化了数据库操作。了解并熟练掌握这种关系映射对于进行高效的JPA编程至关重要。

    JPA一对一,一对多,多对多关系映射

    Java Persistence API(JPA)是Java...理解并熟练掌握一对一、一对多和多对多关系映射对于使用JPA进行数据库操作至关重要。在实际开发中,根据业务需求选择合适的关系映射方式,可以极大地提高开发效率和代码可维护性。

    JPA学习笔记-EJB-04JPA关联映射总结

    3. `@ManyToOne`:多对一关系,多个实体对应另一个实体的单一实例。 4. `@ManyToMany`:多对多关系,多个实体可以关联多个其他实体,通常需要一个中间表来存储关系。 在实际应用中,JPA的关联映射不仅可以简化对象...

Global site tag (gtag.js) - Google Analytics