前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hibernate还提供了注解方式配置映射文件,非常灵活,减少了配置文件的冗余,虽然维护起来相对比较麻烦,但是的确很方便开发.现在开发中(据说)也越来越流行使用注解,这里贴一个使用注解开发的小例子.

  假设有两张表,一张书籍表Book,一张书籍分类表Category,很明显Book和Category是多对一的关系.使用注解应该这样配置:

新建Book实体类:

//entity表示需要持久化的实体类
@Entity
//实体类多对应的表
@Table(name="t_book")
public class Book {
//id主键
@Id
//设置主键生成策略,这里的auto表示自增长 与native对应,
   //(strategy------表示主键生成策略:  
     //  GenerationType.AUTO   默认值。表示让ORM框架自动选择,对应hibernate中的native;
     //  GenerationType.TABLE  使用表一保存ID的值;
     //  GenerationType.IDENTITY  根据数据库的Identity字段生成;
     //  GenerationType.SEQUENCE  根据数据库表的Sequence字段生成;)
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private double price;
private String author;
private Date pubDate;
//get/set方法省略
}

新建Category实体类:

@Entity
@Table(name="t_category")
public class Category { @Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
//一端的配置 @OneToMany(mappedBy="多端的属性")
@OneToMany(mappedBy="category")
private Set<Book> books=new HashSet<Book>();
//get/set方法省略
}

  将两个实体类添加到Hibernate.cfg.xml中去,注意因为添加的是类,不是xml文件,所以包名之间用的是"."而不是"/"相隔.

以上就完成了配置,是不是相当简单.下面新建一个测试类,测试1:自动生成表2:保存数据3:读取数据:

@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
se.create(true, true);
} @Test
public void testSave(){
Session session=HibernateUtil.getSession();
Book book=new Book();
book.setAuthor("金庸");
book.setName("鹿鼎记");
book.setPrice(12.35);
book.setPubDate(new Date());
Book book1=new Book();
book1.setAuthor("土豆");
book1.setName("斗破苍穹");
book1.setPrice(22.35);
book1.setPubDate(new Date()); Category c1=new Category();
c1.setName("武侠类");
book.setCategory(c1); Category c2=new Category();
c2.setName("玄幻类");
book1.setCategory(c2); session.save(book);
session.save(book1);
session.beginTransaction().commit();
session.close();
} @Test
public void testGet(){
Session session =HibernateUtil.getSession(); Book b=(Book)session.get(Book.class, 1);
System.out.println("书籍名称:"+b.getName()+",类别:"+b.getCategory().getName());
System.out.println("=========================");
Category c=(Category)session.get(Category.class, 1);
System.out.print("类别:"+c.getName()+",书籍名称:");
Iterator<Book> it = c.getBooks().iterator();
while(it.hasNext()){
System.out.print(it.next().getName());
}
session.beginTransaction().commit();
session.close();
}

注意:

   1.使用注解需要导入的4个jar包:hibernate-commons-annotations.jar , hibernate-annotations.jar,ejb3-persistence.jar ,hibernate-jpa-2.0-api-1.0.1.Final.jar

  2.使用注解配置映射关系,不再需要*.hbm.xml文件,而是在实体类中以注解形式定义映射关系.

  3.注解在javax.persistence包下,而不是在hibernate包下,特别注意.

hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系的更多相关文章

  1. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  2. Spring整合Hibernate:1、annotation方式管理SessionFactory

    1.在applicationContext.xml文件中初始化SessionFactory(annotation方式) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  3. java AOP使用注解@annotation方式实践

       java AOP使用配置项来进行注入实践 AOP实际开发工作比较常用,在此使用注解方式加深对面向切面编程的理解 废话不多少,先看下面的实例代码 场景: 1.未满一岁的小孩,在执行方法之前打印:“ ...

  4. JavaSE学习笔记--Item1 注解Annotation

    从 JDK 5.0 開始, Java 添加了对元数据(MetaData) 的支持, 也就是 Annotation(注解). 什么是Annotation,以及注解的作用? 三个主要的 Annotatio ...

  5. hibernate笔记--基于主键的单(双)向的一对一映射关系

    上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...

  6. Hibernate笔记——关联关系配置(一对多、一对一和多对多)

    原文:http://www.cnblogs.com/otomedaybreak/archive/2012/01/20/2327695.html ============================ ...

  7. Java学习笔记:注解Annotation

    annotation的概念 In the Java computer programming language, an annotation is a form of syntactic metada ...

  8. spring笔记--通过注解(annotation)配置Bean

    Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...

  9. Hibernate框架单向多对一关联映射关系

    建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName / ...

随机推荐

  1. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

  2. Lua游戏时区问题

    关于cocos2dx-lua版本中游戏时间显示问题 2015-04-19 19:07 1466人阅读 评论(0) 收藏 举报  分类: Lua(29)   cocos2d(38)  版权声明:本文为博 ...

  3. Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)

    之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^ ...

  4. 一起来测试天兔Lepus3.8 Beta版本的MSSQL部分

    一起来测试天兔Lepus3.8 Beta版本的MSSQL部分 产品介绍:http://www.lepus.cc/下载地址:http://www.lepus.cc/soft/18手册地址:http:// ...

  5. C#中使用Socket实现简单Web服务器

    上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...

  6. 日志系统实战(三)-分布式跟踪的Net实现

    介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了.莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是Ios端参数传的不对?还是A系统或B系统提供的接口导致?相信有不少人遇 ...

  7. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  8. Silverlight和WPF中DataContractJsonSerializer对时间的处理差异

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com Silverlight脱胎于WPF,他们的行为不完全并不完全相同,DataContractJsonSerializ ...

  9. cookie自动登录的实现

         cookie自动登录是指把用户登录的信息按期限(自定)保存在客户端,当用户请求登录时判断客户端用没有cookie对象,有的话填充值,否则登录界面的输入框为空,不进行填充.      登录界面 ...

  10. Hibernate增删查改语句

    我用的数据库是MySQL,实体类叫Product create table Product ( proId integer not null auto_increment, proName varch ...