zoukankan      html  css  js  c++  java
  • Hibernate之使用Annotation完成O/R Mapping

    一、 环境搭建和基本映射
     1) 添加Annotation包: 
        hibernate-annotations.jar,ejb3-persistence.jar,hibernate-commons-annotations.jar
     2) 在实体类中尽量使用JPA的标准注解来进行对象关系映射。注解可以添加在属性上,也可以添加在getXxx()方法之上。
        a) @Entity 映射一个实体类
           @Table(name="表名") 指定关联的表
        b) @Id 映射OID
        c) @GeneratedValue(strategy=生成策略) 指定OID的生成策略。
                                它的默认值是GenerationType.AUTO,相当于xml时的native。
                                如果不使用此注解定义Id,就将使用手动指定OID值。JPA注解默认没提供uuid方式。
        d) @Version 映射版本号属性(乐观锁)
        e) @Column(name="列名",nullable=true,unique=true) 指定属性对应列的信息。
        f) @Temporal(TemporalType.TIMESTAMP) 指定日期时间的类型。(TIMESTAMP,DATE,TIME)
        g) 简单属性可以不用注解。默认就是@Basic
        h) @Transient 指定属性不需要持久化.
        i) 复杂属性:关联,继承,组件,联合主键.
     3) 在Hibernate全局配置文件中使用声明映射类的方式:<mapping class="实体类的全限定名"/>
     4) 使用Annotation来映射对象关系时,加载Hibernate全局配置文件要使用AnnotationConfiguration类,如下代码:

         SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
     5) 持久化操作与之前没有区别。
      
    二、映射关联关系
    1. 映射多对一
      1) @ManyToOne
      2) 指定关联列@JoinColumn(name="xxx_id")
      
    2. 映射一对多
      1) @OneToMany  默认会使用连接表做一对多的关联。
      2) 添加@JoinColumn(name="xxx_id")后,就会使用外键关联,而不使用连接表了。

     

    3. 映射双向一对多
      1) 在多端: 
         @ManyToOne
         @JoinColumn(name="外键名")
      2) 在一端:(一对多关联,把关系维护权交给多端更有效率)
         @OneToMany(mappedBy="多端的关联属性名")
         @JoinColumn(name="外键名")

     

    4. mappedBy属性:用在双向关联中,把关系的维护权反转。跟hibernate XML映射中的property-ref一样。

     

    5. cascade属性: 指定级联操作的行为(可多选)
       CascadeType.PERSIST :调用JPA规范中的persist(),不适用于Hibernate的save()方法
       CascadeType.MERGE:调用JPA规范中merge()时,不适用于Hibernate的update()方法
       CascadeType.REMOVE:调用JPA规范中的remove()时,适用于Hibernate的delete()方法
       CascadeType.REFRESH:调用JPA规范中的refresh()时,适用于Hibernate的flush()方法
       CascadeType.ALL:JPA规范中的所有持久化方法。适用于Hibernate中的所有持久化方法
       
    6. cascade属性和mappedBy用在一起时,一定要通过调用双方的set方法来建立关系。

     

    7. 双向一对一
      1) 基于外键
        a) 在主控方:@OneToOne
        b) 在被控方:@OneToOne(mappedBy="对方的关联属性名")
        
      2) 基于主键: JPA标准中没有提供共享主键生成问题的标准方法,需要使用Hibernate的扩展。
        a) 在主控方:Car
        @Id
        @GeneratedValue(generator="my-uuid")
        @org.hibernate.annotations.GenericGenerator(name="my-uuid", strategy="uuid")
        private String id;
        @OneToOne(cascade={CascadeType.ALL})
        @PrimaryKeyJoinColumn
        private Brand brand;
     
         b) 在被控方:Brand
        @Id
        @GeneratedValue(generator="myFG")
        @org.hibernate.annotations.GenericGenerator(name="myFG", 
          strategy="foreign",parameters=@Parameter(name="property",value="car"))
        private String id;
        @OneToOne(mappedBy="brand")
        private Car car;

     

    8. 双向多对多:最好由某一端来维护这个关系会更有效率.示例:学生与课程的多对多
      1) 在主控方:
     @ManyToMany
     @JoinTable(name="student_course", 
       joinColumns={@JoinColumn(name="student_id")},
       inverseJoinColumns={@JoinColumn(name="course_id")})
     private Set<Course> courseSet = new HashSet<Course>();
      2) 在被控方:
     @ManyToMany(mappedBy="courseSet")
     private Set<Student> stus = new HashSet<Student>();
      3) 很多情况都需要把双向多对多拆成两个一对多: 1-->*<--1

     

    三、高级映射
    1. 继承映射:
    1) 整个继承树一张表
     在父类中添加从下注解
    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="type",length=3)
    @DiscriminatorValue("u")
     子类中添加以下注解
    @Entity
    @DiscriminatorValue("w")

    2) 每个子类一张表
    在父类添加如下注解
    @Entity
    @Table(name="user")
    @Inheritance(strategy=InheritanceType.JOINED)
    在子类中跟普通实体类的映射相同

    3) 每个具体类一张表:
    在父类中
    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    public class User {
     @Id
     @GeneratedValue(strategy=GenerationType.TABLE,generator="xxGen")
     @TableGenerator(name="xxGen",allocationSize=1)
     private Long id;
    ... 
    }
    在子类中跟普通实体类的映射相同

     

    2. 组件映射: 组件类上用@Emabbedable。在使用这个组件类的类上用:
     @Emabbed
     @AttributeOverrides({
       @AttributeOverride(name="email", column=@Column(name="p_email")),
       @AttributeOverride(name="address", column=@Column(name="p_address")),
       @AttributeOverride(name="mobile", column=@Column(name="p_mobile"))
     })

     

    3. 联合主键映射
      1. 主键类:用@Emabbedable映射。并实现Serializable接口,使用主键属性重写hashCode()和equals()方法。
      2. 使用这个主键类的类上还是用@Id映射。
      
    四、使用注解定义命名查询

     

    五、Hibernate的扩展注解

  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/chenying99/p/2476658.html
Copyright © 2011-2022 走看看