开发者社区> awbeci> 正文

Hibernate基于注解方式的各种映射全面总结

简介: 1. 使用Hibernate Annotation来做对象关系映射  1) 添加必须包:      hibernate-jpa-2.0-api-1.0.0.Final.jar  2) 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上。
+关注继续查看

1. 使用Hibernate Annotation来做对象关系映射

 1) 添加必须包: 

    hibernate-jpa-2.0-api-1.0.0.Final.jar

 2) 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上。

    a) @Entity 映射一个实体类

       @Table 指定关联的表

    b) @Id 映射OID

    c) @GeneratedValue 指定OID的生成策略

    d) @Version 映射版本号属性

    e) @Column 指定属性对应的列的信息

    f) @Temporal 指定日期时间的类型(TIMESTAMP,DATE,TIME)

    g) 简单属性可以不用注解。默认就是@Basic

    h) @Transient 指定属性不需要映射

    i) 复杂属性:关联,继承,组件,联合主键,集合

    

 3) 在Hibernate全局配置文件中使用声明映射类的方式:

    <mapping class="实体类的全限定名"/>

    

 4) 使用Annotation来映射对象关系时,加载Hibernate全局配置要使用AnnotationConfiguration类

 5) 持久化操作与之前没有区别。

 

2. Hibernate Annotation 基本映射

  

3. 映射多对一

  1) @ManyToOne

  2) 指定关联列@JoinColumn(name="xxx_id")

  

4. 映射一对多

  1) @OneToMany  默认会使用连接表做一对多的关联

  2) 添加@JoinColumn(name="xxx_id")后,就会使用外键关联,而不使用连接表了。

 

5. 映射双向一对多

  1) 在多端: 

     @ManyToOne

  2) 在一端:

     @OneToMany(mappedBy="多端的关联属性名"):----升级后-->  @OneToMany

     @JoinColumn(name="外键名")

     

6. 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规范中的所有持久化方法。

   

7. mappedBy属性:用在双向关联中,把关系的维护权反转

       跟hibernate XML映射中的property-ref一样。

  

8. cascade属性和mappedBy用在一起时,一定要通过调用双方的set方法来建立关系。

 

 

10. 双向一对一

  1) 基于外键

    a) 在主控方:@OneToOne

    b) 在被控方:@OneToOne(mappedBy="对方的关联属性名")

    

  2) 基于主键: JPA标准中没有提供共享主键生成问题的标准方法,使用Hibernate的扩展

    a) 在主控方:Car

       @Id

  @GeneratedValue(generator="my-uuid")

  @GenericGenerator(name="my-uuid", strategy="uuid")

  private String id;

  

  @OneToOne(cascade={CascadeType.ALL})

  @PrimaryKeyJoinColumn

  private Brand brand;

b) 在被控方:Brand

  @Id

  @GeneratedValue(generator="myFG")

  @GenericGenerator(name="myFG", strategy="foreign",parameters=@Parameter(name="property",value="car"))

  private String id;

  

  @OneToOne(mappedBy="brand")

  private Car car;

 

11. 双向多对多

  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>();

12. 把双向多对多拆成两个一对多: 1-->*<--1

 

13. 继承映射:

 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;

...

}

在子类中跟普通实体类的映射相同

 

14. 组件映射

  在组件类中用@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"))

})

 

15. 联合主键映射

  1. 主键类:用@Emabbedable映射。并实现Serializable接口,使用主键属性重写hashCode()和equals()方法。

  2. 使用这个主键类的类中。用@Id映射。

 

参考地址

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WPFのImage控件souce引入的方法总结
原文:WPFのImage控件souce引入的方法总结   1、后台代码相对路径添加(若为绝对路径,换UriKind的属性即可) BitmapImage testBitmapImage = new BitmapImage(new Uri(@"\bin\Sources\ON_btn_AutoDetect.
902 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25057 0
(转)leetcode:Find All Anagrams in a String 滑动窗口方法总结
今天做了几道滑动窗口的题,稍微总结一下。 起因源于早上在leetcode上pick one,随机到了一个easy的题目,想着随便做了,结果半天也找不到最优解,耗时300多ms,A是A了,不过就是暴力罢了。
1420 0
ssh整合问题总结--使用HibernateTemplate实现数据分页展示
  在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完成数据的分页查询.
825 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20365 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18645 0
.net开发中自己遇到的问题自己解决的方法总结
     (1)、关于中取指定长度字符显示的方法      最近在用Lucene.net进行全站搜索内容时,对于repeater控件中用获取内容时,由于该取得的内容较长,所以自然而然的想到截取...
913 0
+关注
awbeci
我的名字叫张威(多好听的名字啊),毕业于哈弗大学(之前和比尔&middot;盖次是同学,自从那家伙创立了威软,我和他的关系就不太好,我发誓要打败他,然后进入安徽机电职业技术学院学习软件技术,你们觉得我会成功么), 现在在一家世界五百强公司任职UFO(想问我是什么公司?叫合肥优尔电子科技有限公司
590
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载