• Hibernate5笔记9--Hibernate注解式开发


    Hibernate注解式开发:

      (1)注解式开发的注意点:

        Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。 
        JPA提供了一套功能强大的注解。Hibernate直接使用了JPA的这套注解。当然,对于JPA中的一些不足,Hibernate又开发了一些自己的注解。这些注解要么继承自JPA,要么是独立的注解,作为JPA的补充。 
        故,我们使用的注解,基本是javax.persistence.Transient包中的。 使用注解时需注意以下几点: 
          (1)使用的均为javax.persistence.Transient包中的注解  

          (2)不再需要映射文件了 

          (3)在Hibernate主配置文件中无需指定映射文件了,但需要指定注解的实体类。

      (2)示例一(基本注解):

     1 @Entity   //表明当前类为实体类
     2 @Table(name="t_student")  //可以省略
     3 public class Student {
     4     @Id
     5     @GeneratedValue(strategy=GenerationType.IDENTITY)  //表明主键值由数据库自己来维护
     6     private Integer id; 
     7     @Basic   //表明当前属性将被持久化导数据库中,该注解为属性的默认注解,可以省略
     8     @Column(name="tname")
     9     private String name;
    10     @Basic   //表明当前属性将被持久化导数据库中,该注解为属性的默认注解
    11     @Column(name="tage")
    12     private int age;
    13     @Transient  //表明当前属性将不写到数据库中 
    14     private double score;

       示例二(使用Hibernate内置主键生成策略):

     1 @Entity   
     2 public class Student {
     3     @Id
     4     @GeneratedValue(generator="xxx")  //使用自己定义的主键生成器
     5     @GenericGenerator(name="xxx", strategy="native")  //生成一个主键生成器,目的是为了使用Hibernate自带的主键生成策略
     6     private Integer id; 
     7     private String name;
     8     private int age;
     9     @Transient  //表明当前属性将不写到数据库中 
    10     private double score;

       示例三(一对多双向关联,并且一方放弃关联关系维护权):

     1 @Entity
     2 public class Country {
     3     @Id
     4     @GeneratedValue(strategy=GenerationType.IDENTITY)
     5     private Integer cid;
     6     private String cname;
     7     
     8     //mappedBy="country" 表示一方放弃维护权,并将维护权交给了对方的关联属性country
     9     @OneToMany(targetEntity=Minister.class, cascade=CascadeType.ALL, mappedBy="country")  //targetEntity可以省略
    10     //一旦一方放弃了维护权,则@JoinColumn注解将不能使用
    11     //@JoinColumn(name="countryId")
    12     private Set<Minister> ministers;
     1 @Entity
     2 public class Minister {
     3     @Id
     4     @GeneratedValue(strategy=GenerationType.IDENTITY)  
     5     private Integer mid;
     6     private String mname;
     7     
     8     @ManyToOne(targetEntity=Country.class, cascade=CascadeType.ALL)  //注意:这里只能使用ALL,因为注解是JPA的注解,如果不用ALL,就对Hibernate的代码不起作用
     9     @JoinColumn(name="countryId")
    10     private Country country;  //关联属性

       示例四(自关联):

     1 @Entity
     2 //新闻栏目
     3 public class NewsLabel {
     4     @Id
     5     @GeneratedValue(strategy=GenerationType.IDENTITY)
     6     private Integer id;
     7     private String name;  //栏目名称
     8     private String content;  //栏目内容
     9     
    10     @ManyToOne(cascade=CascadeType.ALL)
    11     @JoinColumn(name="pid")
    12     private NewsLabel parentNewsLabel;  //父栏目
    13 
    14     @OneToMany(cascade=CascadeType.ALL)
    15     @JoinColumn(name="pid")
    16     private Set<NewsLabel> childNewsLabels;  //子栏目

       示例五(多对多双向关联,代码更简单,无需指定中间表,因为底层实现了很多):

     1 @Entity
     2 public class Course {
     3     @Id
     4     @GeneratedValue(strategy=GenerationType.IDENTITY)
     5     private Integer cid;
     6     private String cname;
     7     
     8     //多对多双向关联的注解,要求有一方要放弃维护权。否则,将要生成两张中间表,当然只有一张中间表起作用
     9     @ManyToMany(cascade=CascadeType.ALL, mappedBy="courses")
    10     private Set<Student> students;
    1 @Entity
    2 public class Student {
    3     @Id
    4     @GeneratedValue(strategy=GenerationType.IDENTITY)
    5     private Integer sid;
    6     private String sname;
    7     
    8     @ManyToMany(cascade=CascadeType.ALL)
    9     private Set<Course> courses;

       示例六(二级缓存,Query缓存不能使用注解):

     1 @Entity
     2 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
     3 public class Country {
     4     @Id
     5     @GeneratedValue(strategy=GenerationType.IDENTITY)
     6     private Integer cid;
     7     private String cname;
     8     
     9     @OneToMany(cascade=CascadeType.ALL)
    10     @JoinColumn(name="countryId")
    11     @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
    12     private Set<Minister> ministers;
     1 @Entity
     2 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
     3 public class Minister {
     4     @Id
     5     @GeneratedValue(strategy=GenerationType.IDENTITY)
     6     private Integer mid;
     7     private String mname;
     8     
     9     @ManyToOne(cascade=CascadeType.ALL)
    10     @JoinColumn(name="countryId")
    11     private Country country;  //关联属性
  • 相关阅读:
    类class解读
    函数重载
    for循环之省略{}
    《c++程序设计现代方法》笔记2
    【程序】c++雇员工资管理系统
    贪婪法
    乘法口诀程序
    百钱买百鸡问题程序
    【转】牛人十个月自学C++ 现在做C#开发工作
    c++基本规则习惯
  • 原文地址:https://www.cnblogs.com/qjjazry/p/6306744.html
Copyright © 2020-2023  润新知