hibernate注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包。

一、单对象操作

复制代码
@Entity  --->  如果我们当前这个bean要设置成实体对象,就需要加上Entity这个注解
@Table(name="t_user")  ---->  设置数据库的表名
public class User { private int id; private String username; private String password; private Date born; private Date registerDate; @Column(name="register_date")  --->  Column中的name属性对应了数据库的该字段名字,里面还有其他属性,例如length,nullable等等 public Date getRegisterDate() { return registerDate; } public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } @Id  --->  定义为数据库的主键ID  (建议不要在属性上引入注解,因为属性是private的,如果引入注解会破坏其封装特性,所以建议在getter方法上加入注解) @GeneratedValue  ---->  ID的生成策略为自动生成   public int getId() { return id; } public void setId(int id) { this.id = id; }   ............ }
复制代码

最后只需要在hibernate.cfg.xml文件里面将该实体类加进去即可:

<!-- 基于annotation的配置 --><mapping class="com.xiaoluo.bean.User"/>
<!-- 基于hbm.xml配置文件 --><mapping resource="com/xiaoluo/bean/User.hbm.xml"/>

这样我们就可以写测试类来进行我们的CRUD操作了。

二、一对多的映射(one-to-many)

这里我们定义了两个实体类,一个是ClassRoom,一个是Student,这两者是一对多的关联关系。

ClassRoom类:

复制代码
@Entity
@Table(name="t_classroom")
public class ClassRoom
{private int id; private String className; private Set<Student> students; public ClassRoom() { students = new HashSet<Student>(); } public void addStudent(Student student) { students.add(student); } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } @OneToMany(mappedBy="room")  --->  OneToMany指定了一对多的关系,mappedBy="room"指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对1的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表) @LazyCollection(LazyCollectionOption.EXTRA)  --->  LazyCollection属性设置成EXTRA指定了当如果查询数据的个数时候,只会发出一条 count(*)的语句,提高性能 public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } }
复制代码

Student类:

复制代码
@Entity
@Table(name="t_student")
public class Student
{private int id; private String name; private int age; private ClassRoom room; @ManyToOne(fetch=FetchType.LAZY)  ---> ManyToOne指定了多对一的关系,fetch=FetchType.LAZY属性表示在多的那一方通过延迟加载的方式加载对象(默认不是延迟加载) @JoinColumn(name="rid")  --->  通过 JoinColumn 的name属性指定了外键的名称 rid (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称) public ClassRoom getRoom() { return room; } public void setRoom(ClassRoom room) { this.room = room; } @Id @GeneratedValue 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; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
复制代码

三、一对一映射(One-to-One)

一对一关系这里定义了一个Person对象以及一个IDCard对象

Person类:

复制代码
@Entity
@Table(name="t_person")
public class Person
{private int id; private String name; private IDCard card; @OneToOne(mappedBy="person")  --->  指定了OneToOne的关联关系,mappedBy同样指定由对方来进行维护关联关系 public IDCard getCard() { return card; } public void setCard(IDCard card) { this.card = card; } @Id @GeneratedValue 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; } }
复制代码

IDCard类:

复制代码
@Entity
@Table(name="t_id_card")
public class IDCard
{private int id; private String no; private Person person; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } @OneToOne  --->  OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护 @JoinColumn(name="pid")  --->  指定外键的名字 pid public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
复制代码

注意:在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。

四、Many-to-Many映射(多对多映射关系)

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

1.通过中间表由任一一个多的一方来维护关联关系

Teacher类:

复制代码
@Entity
@Table(name="t_teacher")
public class Teacher
{private int id; private String name; private Set<Course> courses; public Teacher() { courses = new HashSet<Course>(); } public void addCourse(Course course) { courses.add(course); } @Id @GeneratedValue 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; } @ManyToMany(mappedBy="teachers")  --->  表示由Course那一方来进行维护 public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) { this.courses = courses; } }
复制代码

Course类:

复制代码
@Entity
@Table(name="t_course")
public class Course
{private int id; private String name; private Set<Teacher> teachers; public Course() { teachers = new HashSet<Teacher>(); } public void addTeacher(Teacher teacher) { teachers.add(teacher); } @ManyToMany   ---> ManyToMany指定多对多的关联关系 @JoinTable(name="t_teacher_course", joinColumns={ @JoinColumn(name="cid")}, inverseJoinColumns={ @JoinColumn(name = "tid") })  --->  因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable 这个注解来声明,name就是指定了中间表的名字,JoinColumns是一个 @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Course,所以在对方外键的名称就是 ridinverseJoinColumns也是一个 @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 tid public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } @Id @GeneratedValue 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; } }
复制代码

2.将Many-to-Many拆分成两个One-to-Many的映射(Admin、Role、AdminRole)

Admin类:

复制代码
@Entity
@Table(name="t_admin")
public class Admin
{private int id; private String name; private Set<AdminRole> ars; public Admin() { ars = new HashSet<AdminRole>(); } public void add(AdminRole ar) { ars.add(ar); } @Id @GeneratedValue 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; } @OneToMany(mappedBy="admin")  --->  OneToMany关联到了AdminRole这个类,由AdminRole这个类来维护多对一的关系,mappedBy="admin" @LazyCollection(LazyCollectionOption.EXTRA)   public Set<AdminRole> getArs() { return ars; } public void setArs(Set<AdminRole> ars) { this.ars = ars; } }
复制代码

Role类:

复制代码
@Entity
@Table(name="t_role")
public class Role
{private int id; private String name; private Set<AdminRole> ars; public Role() { ars = new HashSet<AdminRole>(); } public void add(AdminRole ar) { ars.add(ar); } @Id @GeneratedValue 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; } @OneToMany(mappedBy="role")  --->  OneToMany指定了由AdminRole这个类来维护多对一的关联关系,mappedBy="role" @LazyCollection(LazyCollectionOption.EXTRA) public Set<AdminRole> getArs() { return ars; } public void setArs(Set<AdminRole> ars) { this.ars = ars; } }
复制代码

AdminRole类:

复制代码
@Entity
@Table(name="t_admin_role")
public class AdminRole
{private int id; private String name; private Admin admin; private Role role; @Id @GeneratedValue 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; } @ManyToOne  --->  ManyToOne关联到Admin @JoinColumn(name="aid")   public Admin getAdmin() { return admin; } public void setAdmin(Admin admin) { this.admin = admin; } @ManyToOne  --->   @JoinColumn(name="rid") public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } }
复制代码

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

复制代码
       Person p = new Person();p.setName("xiaoluo");session.save(p);IDCard card = new IDCard();card.setNo("1111111111"); card.setPerson(p); session.save(card);
复制代码

以上就是对hibernate annotation注解方式来配置映射关系的一些总结。

转载于:https://www.cnblogs.com/loong-hon/p/4926080.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之vim复制多行、光标跳转到指定行、插入当前光标上和下行

1、复制多行 number yy 2、光标跳转到指定行 :line 3、插入当前光标到上行 O 4、插入当前光标到下行 o

提的最多的数据库“索引”,先来简单了解一下

前言现在的项目对于数据库操作基本上都是使用封装好的ORM框架&#xff0c;这样开发效率相对来说有所提高。但由于框架的封装&#xff0c;会自动生成SQL语句&#xff0c;这让一些小伙伴对SQL产生了一种陌生感(基本不写SQL)&#xff0c;导致排查业务执行缓慢问题时比较盲目&#…

【个人阅读】软件工程M1/M2阶段总结

这次作业是好久以前布置的&#xff0c;由于学期末课程设计任务比较重&#xff0c;我在完善M2阶段的代码的同时又忙于数据库的实现和编译器的实现&#xff0c;一度感觉忙得透不过气来。。。。到这些都基本完成的时候&#xff0c;会看自己以前的阅读心得&#xff0c;觉得经过了M1…

Excel实用函数大全(名称、功能、说明、用法、举例)

我们在使用Excel制作表格整理数据的时候,常常要用到它的函数功能来自动统计处理表格中的数据。这里整理了Excel中使用频率最高的函数的功能、使用方法,以及这些函数在实际应用中的实例剖析,并配有详细的介绍。 1、ABS函数    函数名称:ABS    主要功能:求出相应数字…

DB2 SQL 递归实现多行合并

最终效果 原始数据&#xff1a; 转换脚本&#xff1a; WITH post_a AS ( SELECT DISTINCT T.EMP_NO,S.CODE_ FROM inscndb.DTFMA000_EMP_POST T ,VIEW_BI_POST S WHERE T.POST||-||POST2 S.POST ), post_b AS (SELECT emp_no,code_,ROW_NUMBER() OVER(PARTITION BY EMP_NO ORD…

C++之greater和less

1、greater、 less 他在头文件<functional>里面, greater和less都重载了操作符 定义如下: // TEMPLATE STRUCT greater template<class _Ty> struct greater : public binary_function<_Ty, _Ty, bool> { // functor for operator>bool operator()(cons…

mysql逻辑结构设计_数据库设计:逻辑结构设计

概念结构设计所得的E-R模型是对用户需求的一种抽象的表达形式&#xff0c;它独立于任何一种具体的数据模型&#xff0c;因而也不能为任何一个具体的DBMS所支持。为了能够建立起最终的物理系统&#xff0c;还需要将概念结构进一步转化为某一DBMS所支持的数据模型&#xff0c;然后…

.NET6之MiniAPI(二十五):Dapper

注&#xff1a;如果你使用Dapper一段时间了&#xff0c;这篇你可以跳过去了。在第十二篇中&#xff0c;我们聊过官方的ORM——EntityFramework&#xff0c;它可以把SQL细节都隐藏&#xff0c;这对于一些标准化的关系数据库项目非常便捷。今天&#xff0c;介绍另外一个流行的ORM…

移动端web开发整理

/* 移动端定义字体的代码 */body {   font-family: "Helvetica Neue", Helvetica; } ios端触摸时&#xff0c;会出现一个半透明灰色遮罩  如果想要禁用&#xff0c;可设置-webkit-tap-highlight-color的alpha值为0 body{-webkit-tap-highlight-color: rgba(0,0,…

LeetCode Implement Queue using Stacks (数据结构)

题意&#xff1a; 用栈来实现队列。 思路&#xff1a; 一个栈是不够的&#xff0c;至少要两个。 &#xff08;1&#xff09;插入。永远只插入到stack1中&#xff08;插到栈顶&#xff09;。 &#xff08;2&#xff09;弹出。如果stack2不为空&#xff0c;直接弹出stack2的栈顶&…

C++之STL之priority_queue

1、priority_queue介绍 priority_queue 是优先队列 模板声明带有三个参数,priority_queue<Type, Container, Functional> Type为数据类型,Container为保存数据的容器,Functional为元素比较方式 Container必须是用数组实现的容器,如 vector, deque不能用list, STL里面…

直角三角形知道两边求角度_每日一讲:解直角三角形(3.21)

考点一、直角三角形的性质 1、直角三角形的两个锐角互余&#xff1a;可表示如下&#xff1a;∠C90∠A∠B902、在直角三角形中&#xff0c;30角所对的直角边等于斜边的一半。3、直角三角形斜边上的中线等于斜边的一半4、勾股定理&#xff1a; 如果直角三角形的两直角边长分别为…

用VBA得到EXCEL表格中的行数和列数

用VBA得到EXCEL表格中的行数和列数 每种方法中上面的是Excel的行数&#xff0c;下面的是Excel的列数。 方法1: ActiveSheet.UsedRange.Rows.Count ActiveSheet.UsedRange.Columns.Count 缺点&#xff1a;有时可能会比实际数大一些&#xff0c;原因是如果你把最后几行&#xff0…

Javascript屏蔽鼠标的右键的两种方法。

方法一&#xff1a;利用鼠标button的键值 <script language"javascript">function blockright(oEvent) {var oDiv document.getElementById("display");if (window.event) oEvent window.event; //处理兼容性&#xff0c;获得事件对象if (oEvent.b…

Blazor University (4)组件 — 单向绑定

原文链接&#xff1a;https://blazor-university.com/components/one-way-binding/单向绑定源代码[1]此时我们在页面内显示了一个组件&#xff0c;但内容是静态的。我们真正想要的是能够动态输出内容。如果我们更改 /Components/MyFirstComponent.razor 的内容&#xff0c;我们…

Java Web项目开发流程

2019独角兽企业重金招聘Python工程师标准>>> 1.Web项目开发流程图解 2.Web项目开发的细节&#xff08;转载&#xff09; 任何一个项目或者系统开发之前都需要定制一个开发约定和规则&#xff0c;这样有利于项目的整体风格统一、代码维护和扩展。由于Web项目开发的分…

OpenGL中shader使用

引自&#xff1a;http://blog.csdn.net/wl_soft50/article/details/7916720 http://blog.sina.com.cn/s/blog_923fdd9b0102vbe0.html 与OpenGL ES1.x渲染管线相比&#xff0c;OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES 1.x渲染管线中的“变换和光照”&#xff1b;…

mysql输出代码_mysql常用代码

1、mysql导出和导入导入&#xff1a;mysql -uroot -p --default-character-setutf8 数据库名 < 数据SQL文件导出&#xff1a;mysqldump --opt -R -E -u root --password1234 数据库名 > 数据SQL文件.sql2、检查某表字段是否有NULLset dbname库名,tbname表名;select con…

贪心算法之最短路径问题(Dijkstra算法)

1、问题 一个求单源最短路径的问题。给定有向带权图 G =(V, E ), 其中每条边的权是非负实数。此外,给定 V 中的一个顶点, 称为源点。现在要计算从源到所有其他各顶点的最短路径长 度,这里路径长度指路上各边的权之和。 2、分析 3、代码实现 1、普通C++实现 #include &l…

【ArcGIS风暴】ArcGIS获取线段上等间距的点

题目&#xff1a;现需要沿某条道路等间距安装路灯&#xff0c;请给出路灯点的位置及其坐标 实现思路&#xff1a; 一、数字化道路&#xff0c;获取Road线状矢量数据&#xff08;如shapefile文件&#xff09;。 二、在开始编辑状态下&#xff0c;执行Divide命令&#xff0c;按…