hibernate系列(1)之hibernate基本注解(全)
来源:互联网 发布:淘宝买高达模型 编辑:程序博客网 时间:2024/05/29 05:06
对hibernate的注解都是一知半解的,这次系统记录注解,便于查找
类级别注解
@Entity映射实体类
@Entity(name=”tableName”)name:可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略
注意:使用@Entity时必须指定实体类的主键属性
- @Table
@Table(name=”“,catalog=”“,schema=”“)
@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息。
name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名。
catalog 可选,表示Catalog名称,默认为Catalog(“”)
schema - 可选,表示Schema名称,默认为Schema(“”).
各种数据库系统对Catalog和Schema的支持和实现方式千差万别
- Embeddable
@Embeddable表示一个非Entity类可以嵌入到另一个Entity类中作为属性而存在。例如:employee类中有个department属性,而departtent是个类
@Entitypublic class Employee{ private Department dp;}@Embeddablepublic class Department{}
属性级别注解
添加到属性字段上面或者get访问器上必须统一
@Id
必须,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,
可置于主键属性或者getXxx()前,注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口@SequenceGenerator
@GeneratedValue
@GeneratedValue(strategy=GenerationType,generator=”“):可选,用于定义主键生成策略
strategy表示主键生成策略,取值有:
GenerationType.AUTO
:根据底层数据库自动选择(默认)GenerationType.INDENTITY
:根据数据库的Identity字段生成GenerationType.SEQUENCE
:使用Sequence来决定主键的取值GenerationType.TABLE
:使用指定表来决定主键取值,结合@TableGenerator使用@Column
@Column-可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。
常用属性:
name:可选
,表示数据库表中该字段的名称,默认情形属性名称一致
nullable
: 可选,表示该字段是否允许为null,默认为true
unique
: 可选,表示该字段是否为唯一标识,默认为false
length
: 可选,表示该字段的大小,仅对String类型的字段有效,默认值225,主键不能使用默认值
insertable
: 可选,表示在ORM框架执行插入操作时,该字段是否应出现INSERTRT语句中,默认为true
updateable
: 可选,表示在ORM框架执行更新操作时,该字段是否应该出现在
UPDATE语句中,默认为true。对于已经创建
就不可以更改的字段,该属性非常有用@Enbedded
@Embedded是注释属性的,表示该属性的类是嵌入类。
注意:同时嵌入类也必须标注@Embeddable注解@EnbeddedId
@EmbeddedId使用嵌入式主键类实现复合主键
注意:嵌入式主键类必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法@Lob
@Lob注解表示属性将被持久化为Blob或者Clob类型, 具体取决于属性的类型
@Version
@Version注解来发现数据库记录的并发操作。当JPA运行时检测到一个并发操作也在试图更改同一条记录。它会抛出一个尝试提交的事务异常。
- @Basic
但对于一些特殊的属性,比如长文本型text、字节流型blob型的数据,在加载Entity时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能严重造成资源的占用。要想解决这些问题,此时就需要设置实体属性的加载方式为惰性加载(LAZY)。
@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
fetch:抓取策略,延时加载与立即加载 - @transient
表示该属性并非一个到数据库表的字段映射,ORM 框架将忽略该属性,ORM 默认为@Basic
关联级别注解
- 一对一单向关外键
public class Student{ private String id; private IdCard idCard; ... @OneToOne(cascade=CascadeType.ALL) // 级联关系(数据同步,删除一边,另一边也删除等) @JoinColumn(name="cid",unique=true) // 外键名称 public IdCard setIdCard(){ this.idCard = idCard; } } }public class IdCard{ private String iid; ...}
一对一双向外键
注意 :双向关联只能交给一方去控制,不可能双方都保存关联关系
public class Student{ private String id; private IdCard card; ... @OneToOne(cascade=CascadeType.ALL) // 级联关系(数据同步,删除一边,另一边也删除等) @JoinColumn(name="cid",unique=true) // 外键名称 public IdCard setCard(){ this.idCard = idCard; } } }public class IdCard{ private String iid; private Student student; @OneToOne(mappedBy("card")) //card是指Student.card public Student setStudent(){ } ...}
- 多对一(一对多)单向外键:多方持有一方的引用
public class Student{ private String id; private ClassRoom classRoom; ... @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //级联关系,抓取规则 // @JoinColumn中的name为当前类的属性名,(多对一单向,有多方维护)所以,name为student中的cid,而ReferenceColumnName为引用表的列(多对一单向,所以为一方的引用列)即ClassRoom中的主键列 @JoinColumn(name="cid",referencedColumnName="CID") public CLassRoom setClassRoom(ClassRoom classRoom){ this.classRoom = classRoom; } }public class ClassRoom{ private String cid; ...}
- 多对一(一对多)双向外键:多方持有一方的引用,一方持有多方的集合
student不变
public class Student{ private String id; private ClassRoom classRoom; ... @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //级联关系,抓取规则 // name为ClassRoom.cid @JoinColumn(name="cid") public CLassRoom setClassRoom(ClassRoom classRoom){ this.classRoom = classRoom; } } }// ClassRoom添加public class ClassRoom{ private String cid; private Map<String,Student> student; @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY) //级联关系,抓取规则 @JoinColumn(name="cid") public Map<String,Student> getStudent(){ } ...}
- 多对多单向关联
Teacher类中
@ManyToMany
@JoinTable(name=”student_teacher”,//中间表名
joinColumns=@JoinColumn(name=”teacher_id”),//这个类在表中的id
inverseJoinColumns=@JoinColumn(name=”student_id”)//反转的类在联合表中的id
)
public Set getStudentSet() {
return studentSet;
}
- 多对多双向关联
Teacher类
@ManyToMany
@JoinTable(name=”student_teacher”,
joinColumns=@JoinColumn(name=”teacher_id”),//这个类在表中的id
inverseJoinColumns=@JoinColumn(name=”student_id”)//反转的类在联合表中的id
)
public Set getStudentSet() {
return studentSet;
}
Student类
@ManyToMany(mappedBy=”studentSet”)
public Set getSet() {
return set;
}
- hibernate系列(1)之hibernate基本注解(全)
- 【转载】hibernate基本注解(全)
- Hibernate系列之基本配置
- hibernate注解全解
- hibernate 注解全方案
- 学好hibernate系列之常用注解开发
- 【Hibernate系列】(四):基本映射
- spring mvc+hibernate 实现事务管理(全注解版)
- springmvc+spring+hibernate 整合 annotation(全注解)方式
- spring mvc+hibernate 实现事务管理(全注解版)
- spring mvc+hibernate 实现事务管理(全注解版)
- Hibernate Annotation基本注解
- hibernate 注解 系列文章
- hibernate系列十八:注解
- 【Hibernate】(1)Hibernate的基本用法
- hibernate注解之简介(一)
- hibernate注解(一)
- hibernate注解(二)
- Mac实用小技巧--Finder左边栏添加文件夹
- Java中的equals和hashCode
- 八皇后问题
- block,inline和inlinke-block的区别
- 原博文地址
- hibernate系列(1)之hibernate基本注解(全)
- dfs。。状态压缩dp poj3411
- Perfect Squares
- java并发编程中CountDownLatch和CyclicBarrier的使用
- Java异常类解析
- 喵喵喵
- VS2012创建C++项目失败,解决方法
- Java中的String,StringBuffer,StringBuilder区别
- 努力到感动自己,拼搏到无能为力