`
命运魔鬼
  • 浏览: 3578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate 注解(Annotation) 的配置

阅读更多
一:映射简单属性:
实例1:

@Entity                                     (@Entity 注解将该类声明为持久类)
@Table(name="FRUITS_PATENT",catalog="",schema="",uniqueConstraints= {@UniqueConstraint(columnNames={"name","pwd"})})
(@Table 为实体Bean指定对应数据库表,目录和schema的名字,uniqueConstraints为表添加约束)
public class Patent implements Serializable
{
// 主键 唯一标示 id
@Id                             (@Id 注解声明了该实体Bean的标识符(OID))
@GeneratedValue(generator="paymentableGenerator")
(generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式)
@GenericGenerator(strategy="uuid",name="paymentableGenerator")
(strategy------表示主键生成策略: 
     GenerationType.AUTO   默认值。表示让ORM框架自动选择,对应hibernate中的native;
     GenerationType.TABLE  使用表一保存ID的值;
     GenerationType.IDENTITY  根据数据库的Identity字段生成;
     GenerationType.SEQUENCE  根据数据库表的Sequence字段生成;)
@Column(length=32)
private String id;

//名称
@Column(length=400)
(声明列属性:@Column
   name="列名",
   unique=false | true   唯一性,
   nullable= true | false  是否允许为空,
   insertable= true | false  是否允许插入数据,
   updateable=true | false  是否允许修改数据,
   length= 255  字段的长度设置,
   precision= 0   精度,
   scale=0    数值范围  )
private String name;
private String pwd;

//相关产品
@Transient                     (@Transient,忽略属性。该字段将不被持久化)
private List relateProduces;

// 申请日
@Temporal(TemporalType.DATE)
(日期时间属性:
   TemporalType.DATE   取值如:2012-06-06
   TemporalType.TIME   取值如:22:50:30
   TemporalType.TIMESTAMP 默认选项,取值如:2012-06-06  22:50:30)
private Date appDate;
  
     //说明书摘要
@Lob         
(@Lob 大对象属性,注解属性将被持久化为 Blog 或 Clob 类型:
具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 Clob 类型.               java.sql.Blob, Byte[], byte[] 和 serializable type 将被持久化为 Blob 类型。)
@Basic(fetch=FetchType.LAZY,optional=true)

(@Basic表示一个简单的属性到数据库表的字段的映射;
   fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示立即加载(即加载数据的时候是一次性加载所有的数据,可能会造成不必要的性能浪费,使用是应该慎重考虑。)和延迟加载(即只有当你真正访问关联关系的时候,才会执行所需要的select语句),默认为EAGER;optional:表示该属性是否允许为null,默认为true)
@Column(name="DtaContent", columnDefinition="CLOB", nullable=true)
private String abs;

}
二:关联映射关系:
(1).  对于单向关联关系来说:关系写哪方,就由哪方来管理;
     而对于双向关联关系来说:一般情况由多方管理,
     Xml:inverse="true"同注解中的
     @OneToMany(@mappedBy="对方") //反向配置,交由对方管理

(2). 单向多对一映射,是把一方的id做为多方的一个外键使用注解                    @JoinColumn(name="外键名")配置在多方;
而单向一对多的映射中,是把一方的id做为多方的一个外键使用注解 @JoinColumn(name="外键名")配置在一方。

1.单向多对一关联映射:(多方有一方的引用,一方没有多方的引用)
订单Order和用户User是一个ManyToOne的关系,实例如下:
@Entity
public class Order{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
 
  @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
  @JoinColumn(name="user_id")                                 (@JoinColumn(name="外键"))
  private User  user;
}
(@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键;
optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
fetch:表示抓取策略,默认为FetchType.EAGER(即使加载),或者FetchType.LAZY(即延迟加载)
cascade:指定级联操作的行为(可多选),默认为无级联操作:
CascadeType.PERSIST:级联新增
CascadeType.MERGE:级联修改
CascadeType.REMOVE:级联删除
CascadeType.REFRESH:级联刷新
CascadeType.ALL:以上4种方法都适用
targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.)



@Entity
public class User{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
}

2.单向一对多关联映射(一方有集合属性,包含多个多方,而多方没有一方的引用):
种类Category 和产品Product 是OneToMany的关联关系,实例如下:
@Entity
public class Category {
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="cate_id")                                 (@JoinColumn(name="外键"))
  private List<Product> productList;
}

@Entity
public class Product {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
}

3.双向一对多关联映射(两边都有对方的引用,方便查询):
种类Category 和产品Product 是OneToMany的关联关系,实例如下:
@Entity
public class Category {
  @Id  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade=CascadeType.ALL,mappedBy="cate")
  private List<Product> productList;
}
(@OneToMany 设置一对多关联。
cascade属性指定关联级别,cascade属性有五个值,分别是
CascadeType.PERSIST(级联新建),
CascadeType.REMOVE(级联删除),
CascadeType.REFRESH(级联刷新),
CascadeType.MERGE(级联更新),
CascadeType.ALL(全部四项);
fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载。
(mappedBy="多段的属性":用在双向关联中,把关系的维护权反转)  )
@Entity
public class Product {
  @Id  @GeneratedValue
  private Long id;
  private String name;

  @ManyToOne(cascade=
     {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
  @JoinColumn(name="cate_id")
  private Category cate;
}
双向一对多关联映射配置方法:
"一端"配置:
@OneToMany(cascade=CascadeType.ALL,mappedBy="“多端”的属性")
Public List<“多端”类> get“多端”列表()  { return “多端”列表 }
“多端”配置:
  方法一:
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="外键")
public 主表类 get主表类()   { return 主表对象 }
  方法二:
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="关联表名",
joinColumns = @JoinColumn(name="主表外键"),
     inverseJoinColumns = @JoinColumns(name="从表外键")  )

4.一对一基于外键关联:
用户 User(主表)和省份证号 IdCard (从表)是一对一的关联关系,实例如下:
@Entity
public class User{
  @Id
  @GeneratedValue
  private Long id;
  private String loginName;

  @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
  @JoinColumn(name="card_id")
  private IdCard  idCard;
}
(@OneToOne 设置一对一的关联关系。
cascade属性指定关联级别,
fetch:指定数据的加载策略,
      (@JoinColumn(name="外键"))   )

@Entity
public class IdCard {
  @Id
  @GeneratedValue
  private Long id;
  private String idCardNo;
  @OneToOne(mappedBy="idCard") 
                   (mappedBy="主表类中的从表属性":用在双向关联中,把关系的维护权反转)
  private User user;
}

一对一基于外键的关联配置方法:
方法一:
  主表配置:
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY/EAGER)
@JoinColumn(name="主表外键")  //这里指定的是数据库中的外键字段名。
public 从表类 get从表类()  {return 从表类 }
  从表配置:
@OneToOne(mappedBy ="主表类中的从表属性")
//例主表User中有一个从表属性是IdCard  类型的idCard  ,这里就填idCard 
public 主表类 get主表类() { return 主表对象 }
注意:@JoinColumn是可选的。
      默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。  

方法二:
  主表配置:
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY/EAGER)
@JoinTable( name="关联表名",
            joinColumns = @JoinColumn(name="主表外键"),
            inverseJoinColumns = @JoinColumns(name="从表外键")  )
  从表配置:
     @OneToOne(mappedBy ="主表类中的从表属性")
//例主表User中有一个从表属性是IdCard  类型的idCard  ,这里就填idCard public 主表类 get主表类(){return 主表对象}

5.单向多对多关联映射:
学生Student和课程Course是多对多的关联关系,实例如下:
@Entity
public class Student{
  @Id @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @ManyToMany(cascade=CascadeType.PERSIST)
  @JoinTable(name="student_course",
       joinColumns={@JoinColumn(name="student_id")},
       inverseJoinColumns={@JoinColumn(name="course_id")})
  private Set<Course> courses;
}

@Entity
public class Course {
  @Id @GeneratedValue
  private Long id;
  private String name;
}
6.双向多对多关联映射:
  学生Student和课程Course是多对多的关联关系,实例如下:
@Entity
public class Student{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @ManyToMany(cascade=CascadeType.PERSIST)
  @JoinTable(name="student_course",
       joinColumns={@JoinColumn(name="student_id")},
       inverseJoinColumns={@JoinColumn(name="course_id")})
  private Set<Course> courses;
}

@Entity
public class Course {
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  @ManyToMany(mappedBy="courses")
  private Set<Student> students;
}

7.多对多拆成两个一对多(1-->*<--1) 关联映射:
学生Student和课程Course是多对多的关联关系,由于多对多关系不能保存两个实体之间共有的属性,所以用一个中间实体类来记录两个多对多实体之间共有的关系;可以用一个StudentCourse实体来表示两者多对多中的众多关系中的一个关系。即Student与StudentCourse,Course与StudentCourse之间的关系都为一对多的关系。

@Entity
public class Student{
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private String grade;

  @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="stu")
  @JoinColumn(name="student_id")
  private List<StudentCourse> scs;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy="“多端”的属性名称")
@JoinColumn(name="外键")
Public List<“多端”类> get“多端”列表()  { return “多端”列表 }

@Entity
public class Course{
  @Id
  @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="cou")
  @JoinColumn(name="course_id")
  private List<StudentCourse> scs;
}

@Entity
public class StudentCourse {
  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
  @JoinColumn(name="student_id",nullable=false)
  private Student  stu;

  @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
  @JoinColumn(name="course_id", nullable=false)
  private Course  cou;
  private Double score;

}
@ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="外键")
public 主表类 get主表类()   { return 主表对象 }
分享到:
评论

相关推荐

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    hibernate注解annotation的jar

    Hibernate注解是Hibernate框架的一个关键部分,它允许开发者在Java类和属性上直接应用元数据,从而避免了传统的XML配置文件。本压缩包包含的三个jar文件——`hibernate-annotations.jar`、`hibernate-commons-...

    hibernate-annotation

    而Hibernate注解则是其在ORM(对象关系映射)领域的进一步进化,它允许开发者将元数据直接嵌入到Java类和属性的声明中,从而避免了XML配置文件的繁琐。本篇将详细阐述Hibernate注解的相关知识。 一、Hibernate注解...

    hibernate-annotation 所需要的jar包

    3. **Hibernate Annotation**: Hibernate的注解是在Java类和属性上添加元数据的方式,它替代了传统的Hibernate XML配置文件。通过注解,可以在实体类和属性上直接定义数据库映射,如@Entity表示一个数据库表,@Table...

    Hibernate-Annotation-3.4.0帮助文档

    Hibernate注解是一种元数据方式,允许开发者直接在Java类和属性上声明数据库相关的元信息。这包括实体类、字段、关联等的定义,使得数据库模型与Java对象模型之间的映射更加紧密。 **2. 主要注解** - `@Entity`: ...

    Hibernate Annotation jar

    现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的...

    hibernate-Annotation.jar

    在Hibernate 3.x版本中,引入了Annotation注解,这是一种元数据的方式,可以替代XML配置文件来描述对象与数据库表之间的映射关系。 **Hibernate Annotation注解** 在Hibernate 3.x之前,对象到数据库的映射通常...

    hibernate _annotation 注解编程

    ### Hibernate Annotation注解编程知识点详解 #### 一、概述与设置环境 - **概述**:Hibernate 是一个流行的 Java 持久层框架,它提供了一种面向对象的方式来处理数据库操作。Hibernate 支持多种元数据定义方式,...

    hibernate-annotation-helloword

    在**hibernate-annotation-helloworld**中,"annotation"表示使用的是Hibernate的注解驱动配置,而非XML配置。注解使得代码更简洁,更易于阅读和维护。在Java类中,我们可以通过如@Entity、@Table、@Id等注解,直接...

    hibernate annotation hibernate3

    《Hibernate注解与Hibernate3深度解析》 在Java开发领域,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇将深入探讨Hibernate 3版本中的注解使用,帮助开发者理解如何利用注解进行...

    springmvc + hibernate annotation 配置

    在本篇文章中,我们将详细探讨如何将Spring MVC与Hibernate结合,并利用注解(Annotation)进行配置。 首先,让我们了解这两个框架的基本概念。Spring MVC是Spring框架的一部分,它是一个用于构建Web应用的模型-...

    Hibernate Annotation 中文文档

    Hibernate Annotation是Hibernate框架的一个扩展,它允许开发者直接在Java类和属性上使用注解(Annotations),来定义实体类与数据库表之间的映射关系。相比于XML配置,注解提供了一种更加内聚和直接的方式,使得...

    hibernate注解所需jar包

    在Java开发领域,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来...正确地引入和配置所需的jar包是利用Hibernate注解功能的第一步,也是至关重要的一步。

    hibernate annotation jar

    4. Java 5及以上版本:Hibernate 3.3开始支持Java 5的注解,这意味着开发者可以利用这些新特性,如`@Override`、`@Deprecated`等,以及在ORM中使用的特定Hibernate注解。 5. XML与注解的对比:在Hibernate 3.3之前...

    最全的Hibernate Annotation API文档

    综上所述,“最全的Hibernate Annotation API文档”涵盖了从基本的实体映射到复杂的关系映射,再到高级特性的全面知识,是Java开发者学习和使用Hibernate注解的重要参考资料。通过深入理解这些注解,可以更好地掌握...

    Hibernate-Annotation中文教程.docx

    Hibernate 注解中文教程 Hibernate 是一个强大的 Java 持久性框架,近年来不断发展,成为 Java 数据库持久性的事实标准。它非常强大、灵活,而且具备了优异的性能。使用 Hibernate 注解可以简化 Hibernate 代码,使...

    HibernateAnnotation注解api

    HibernateAnnotation注解 api手册

    Hibernate-Annotation中文教程.pdf

    传统上,Hibernate 的配置依赖于外部 XML 文件,而最近发布的几个 Hibernate 版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法,即 Hibernate Annotation 库。借助新的 Hibernate Annotation 库,即可一次性地...

    Hibernate-Annotation初步.rar

    使用Hibernate注解,我们可以直接在实体类上声明如@Entity、@Table、@Id等注解,来标识这个类是一个数据库表的映射,它的主键是什么,以及属性如何映射到表的列。例如: ```java @Entity @Table(name = "User") ...

Global site tag (gtag.js) - Google Analytics