zoukankan      html  css  js  c++  java
  • hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

      前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个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包下,特别注意.

  • 相关阅读:
    CentOS 7 设置iptables防火墙开放proftpd端口
    Android手机修改Hosts的方法
    Wireshark提示没有一个可以抓包的接口
    while read line无法循环read文件
    Nagios新添加的hosts和services有时显示,有时不显示问题解决
    Nginx配置http强制跳转到https
    xargs rm -rf 与 -exec rm
    解决vim不能使用方向键和退格键问题
    NRPE: Unable to read output 问题处理总结
    MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5244301.html
Copyright © 2011-2022 走看看