Hibernate注解

前言:

  最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件。下面拿个小例子说一下。

数据库物理模型:

数据库的描述:

  一篇博客随笔可以分到不同的类中,一个类中又可以包含许多不同的博客随笔。就如同博客园的设计。也就是上图中 博客-组 和 博客-消息是多对多的映射。

Hibernate关联映射方式:

  双向N-N关联, 两端都要使用Set集合属性,两端都增加对集合属性的访问。双向N-N关联没有太多的选择,只能采用连接表来建立两个实体之间的关联关系。

生成sql语句:

drop table if exists blogGroup;drop table if exists blogMessage;drop table if exists groupMessage;

create table blogGroup
(groupId              int not null auto_increment,groupName            varchar(50),primary key (groupId)
);

create table blogMessage
(msgId                int not null auto_increment,msgContent           varchar(1000),primary key (msgId)
);

create table groupMessage
(groupId              int not null,msgId                int not null,primary key (groupId, msgId)
);alter table groupMessage add constraint FK_Relationship_1 foreign key (groupId)references blogGroup (groupId) on delete restrict on update restrict;alter table groupMessage add constraint FK_Relationship_2 foreign key (msgId)references blogMessage (msgId) on delete restrict on update restrict;

PO(persisent object)类:

  PO = POJO(plain ordinary java object) + 注解

PO : BlogGroup 

package com.blog.entriy;

@Entity
@Table(name="blogGroup")
public class BlogGroup implements Serializable{@Id@Column(name="groupId")@GeneratedValue(strategy=GenerationType.IDENTITY)private int groupId;@Column(name="groupName")private String groupName;//fetch=FetchType.EAGER 抓取实体时,立即抓取关联实体,我用的get()方式加载一个对象//ascadeType.PERSIST, CascadeType.MERGE, 分别是更新和保存时级联@ManyToMany(targetEntity=BlogMessage.class, cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)@JoinTable(name="groupMessage",joinColumns=@JoinColumn(name="groupId", referencedColumnName="groupId"),inverseJoinColumns=@JoinColumn(name="msgId", referencedColumnName="msgId"))private Set<BlogMessage> message = new HashSet<BlogMessage>();public int getGroupId() {return groupId;}public void setGroupId(int groupId) {this.groupId = groupId;}public String getGroupName() {return groupName;}public void setGroupName(String groupName) {this.groupName = groupName;}public Set<BlogMessage> getMessage() {return message;}public void setMessage(Set<BlogMessage> message) {this.message = message;}
}

PO : BlogMessage 

package com.blog.entriy;@Entity
@Table(name="blogMessage")
public class BlogMessage implements Serializable{@Id@Column(name="msgId")@GeneratedValue(strategy=GenerationType.IDENTITY)private int msgId;@Column(name="msgContent")private String msgContent;@ManyToMany(targetEntity=BlogGroup.class)@JoinTable(name="groupMessage",joinColumns=@JoinColumn(name="msgId", referencedColumnName="msgId"),inverseJoinColumns=@JoinColumn(name="groupId", referencedColumnName="groupId"))private Set<BlogGroup> group = new HashSet<BlogGroup>();public int getMsgId() {return msgId;}public void setMsgId(int msgId) {this.msgId = msgId;}public String getMsgContent() {return msgContent;}public void setMsgContent(String msgContent) {this.msgContent = msgContent;}public Set<BlogGroup> getGroup() {return group;}public void setGroup(Set<BlogGroup> group) {this.group = group;}
}

Hibernate中数据的三种状态

  补充一下:Dao层的操作,需要掌握Hibernate中数据的三种状态

  1,  临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;

  2,  持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

  3,  游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。

  

盗图两张

  1.对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)。

  2.瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句。

  3.离线对象就是,数据库存在该对象,但是该对象又没有被session所托管。

DAO层:

  分别测试了不同方式的插入操作, 以及更新和删除。具体看函数的实现。

package com.blog.dao;public class BlogDao {private SessionFactory sessionFactory;  public Session getSession() {  return sessionFactory.getCurrentSession();  }  public SessionFactory getSessionFactory() {  return sessionFactory;  }  public void setSessionFactory(SessionFactory sessionFactory) {  this.sessionFactory = sessionFactory;  }  public BlogGroup get_test(int id){BlogGroup blogGroup = null;Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();blogGroup = (BlogGroup)session.get(BlogGroup.class, id);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}return blogGroup;}
  //只插入一端博客-组(BlogGroup)
public void insert_test1(){Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();BlogGroup blogGroup = new BlogGroup();blogGroup.setGroupName("html");session.save(blogGroup);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}}//同时插入两端(博客-组 和 博客-消息),没有用cascade级联操作,所以BlogGroup和BlogMessage两端都要先持久化public void insert_test2(){Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();BlogGroup blogGroup = new BlogGroup();blogGroup.setGroupName("c++");BlogMessage blogMessage = new BlogMessage();blogMessage.setMsgContent("c++ primer");session.save(blogMessage);Set<BlogMessage> message = new HashSet<BlogMessage>();message.add(blogMessage);blogGroup.setMessage(message);session.save(blogGroup);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}}//同时插入两端,对BlogGroup设置persist级联操作 @ManyToMany(cascade={CascadeType.PERSIST})public void insert_test3(){Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();BlogGroup blogGroup = new BlogGroup();blogGroup.setGroupName("javaee");BlogMessage blogMessage = new BlogMessage();blogMessage.setMsgContent("Spring+hibernate+struct");blogGroup.getMessage().add(blogMessage);session.persist(blogGroup);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}}//向博客-组(BlogGroup)添加新的 博客-消息(BlogMessage),对BlogGroup再添加一个更新的级联操作,CascadeType.MERGE public void update_test(){BlogGroup blogGroup = get_test(1);//得到blogGroup主键为1的groupSession session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();BlogMessage blogMessage = new BlogMessage();blogMessage.setMsgContent("css 学习笔记");blogGroup.getMessage().add(blogMessage);session.merge(blogGroup);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}}//删除某一个博客-组(BlogGroup),因为不能删除我们写的博客消息,所以不能有删除的级联操作
  //注意:我们有三个表,分别是“博客-组”, “博客-消息”,“组-消息”,当从“博客-组”中删除一条记录X时,表“博客-消息”中和X相关的数据不会删除,
  //因为我们没有设置级联关系,但是表“组-消息”中和X相关的数据会删除干净,表“组-消息”是中间关联表,一方被移除之后,该表相关数据自然被移除。
public void delete_test(){BlogGroup blogGroup = get_test(1);//得到blogGroup主键为1的groupSession session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();session.delete(blogGroup);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();}} }

罗列所有持久化类的类名:

  hibernate.cfg.xml中配置:

 <hibernate-configuration> <session-factory> ...  

      <mapping class="com.blog.entriy.BlogGroup"/>
      <mapping class="com.blog.entriy.BlogMessage"/>

     ...</session-factory> 
 </hibernate-configuration> 

 

  如果整合了Spring:application.cfg.xml中的配置<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <!--Spring中: 包扫描的方式加载注解类 --><property name="annotatedClasses"><list><value>com.blog.entriy.BlogGroup</value><value>com.blog.entriy.BlogMessage</value></list></property>    <!--  通过配置文件的方式获取数据源,只是通过XML管理映射方式的。<property name="mappingResources"><list>以下用来列出所有的PO映射文件<value>publishparty.cfg.xml</value></list></property>        -->
     .....
</bean>

 

转载于:https://www.cnblogs.com/hujunzheng/p/5065409.html

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

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

相关文章

zyUpload+struct2完成文件上传

前言&#xff1a; 最近在写自己的博客网站&#xff0c;算是强化一下自己对s2sh框架的理解。期间遇到了很多问题&#xff0c;这些问题在写之前都考虑过&#xff0c;感觉也就是那样吧。但正真遇到了&#xff0c;也挺让人难受的。就利用zyUpload这个js插件实现文件的上传&#xff…

java发送内嵌图片邮件

前言&#xff1a; 博客系统中需要邮件服务的功能&#xff0c;以前写过类似的功能&#xff0c;不过功能太简单了&#xff0c;仅仅是发送文本内容&#xff0c;现在尝试一下发送内嵌图片邮件&#xff01; 准备工作&#xff1a; 请参考&#xff1a;http://www.cnblogs.com/hujunzhe…

SD卡移植FAT32文件系统无MBR

问题&#xff1a;在研究SD卡和FAT32文件系统的时候&#xff0c;发现SD卡有的有MBR&#xff0c;有的没有MBR&#xff0c;这个为什么呢&#xff1f; 分析&#xff1a;MBR是主引导记录&#xff0c;是在给磁盘分区的时候建立的&#xff0c;我们的SD卡没有这个可能就是没有进行过分区…

FAT32文件系统介绍

FAT32文件系统&#xff08;一&#xff09;为什么要有文件系统&#xff08;二&#xff09;FAT32文件系统组成&#xff08;三&#xff09;分步介绍各部分(1) 首先介绍一下MBR(2)DBR介绍(3)FAT表介绍(4) 数据区&#xff08;一&#xff09;为什么要有文件系统 文件系统是操作系统用…

java中动态代理实现机制

前言&#xff1a; 代理模式是常用的java设计模式&#xff0c;它的特征是代理类与委托类有同样的接口&#xff0c;代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类&#xff0c;以及事后处理消息等。代理类与委托类之间通常会存在关联关系&#xff0c;一个代理类…

libiconv库简单裁剪支持CP437编码

有许多人在做项目的时候都会遇到字符编码的不一致导致的乱码问题&#xff0c;那如何去解决呢&#xff1f;在Linux系统上可以通过iconv函数族来进行编码转换&#xff0c;但有时候我们并不需要全部的字符集&#xff0c;因为可能会占用比较大的空间&#xff0c;本文主要支持CP437编…

简单java在线测评程序

简单java程序在线测评程序 一&#xff0e;前言 大家过年好&#xff01;今年的第一篇博客啊&#xff01;家里没有网&#xff0c;到处蹭无线&#xff01;日子过得真纠结&#xff01;因为毕设的需求&#xff0c;简单写了一个java程序在线测评程序&#xff0c;当然也可以在本地测试…

简单文本编辑器

一、前言 聚天地之灵气&#xff0c;集日月之精华&#xff01;一个简单的java文本编辑器由此而生。毕设所需&#xff0c;很是无奈&#xff01; 二、界面预览 三、实现思路 1.字体选择器的实现 (1).字体类 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出现data abort

&#xff08;一&#xff09;问题描述 u-boot下新增了一条update的命令&#xff0c;直接输入update没有报错&#xff0c;但是输入up按TAB键补全时发现出现data abort&#xff0c;而且输入不支持的命令也会有data abort &#xff08;二&#xff09;解决方法 最开始我包含的头…

core文件如何分析

目录(一&#xff09;什么是coredump(二)coredump产生的条件&#xff08;1&#xff09;coredump产生主要原因&#xff1a;&#xff08;2&#xff09;如何生成coredump(三&#xff09;gdb使用(四&#xff09;实例调试coredump文件(五&#xff09;总结(一&#xff09;什么是coredu…

SpringMVC+FreeMarker

前言&#xff1a; 最近在学习SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前没有接触过。利用SpringMVC开发其实还有许多的步骤&#xff0c;比如控制层&#xff0c;服务层&#xff0c;持久化层&#xff0c;实体等等&#xff0c;先弄了一个小demo来总结一下Spr…

SpringMVC那点事

一、SpringMVC返回json数据的三种方式 1、第一种方式是spring2时代的产物&#xff0c;也就是每个json视图controller配置一个Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

(一)最邻近插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;最邻近插值实现&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;最邻近插值实现 一般情况下我…

(二)双线性插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;双线性插值原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;双线性插值原理 一般情况下我…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...&#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 关键字&#x…

基于matlab的步进电机仿真(一)

这里写目录标题环境准备基础准备模型参数输入和输出仿真原理图仿真资源环境准备 MatLab2021b 基础准备 打开Matlab&#xff0c;在帮助文档里面搜索step motor,我们这里选择如下模型 该模型实现了一个通用的步进电机模型&#xff1a; 可变磁阻步进电机永磁或混合步进电机 …

java自定义类加载器

前言 java反射&#xff0c;最常用的Class.forName()方法。做毕设的时候&#xff0c;接收到代码字符串&#xff0c;通过 JavaCompiler将代码字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse项目中的bin目录里&#xff09;&#xff0c;然后通过jav…

repo介绍(一)

repo简介 Repo 是我们以 Git 为基础构建的代码库管理工具,可以组织多个仓库的上传和下载。它是由一系列的Python脚本组成&#xff0c;封装了一系列的Git命令&#xff0c;用来统一管理多个Git仓库 一个大型的项目可能由很多小的仓库组合而成的&#xff0c;为了方便统一管理各个…

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…