Hibernate-注解
Posted wqq-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate-注解相关的知识,希望对你有一定的参考价值。
一, 为啥用注解
Hibernate注解使得原本放在xml文件中的信息直接表现在类中
为什么要用注解呢,因为注解可以简洁快速地在编写代码的同时实现映射关系
注解的好处就是语言简洁,即插即用. 坏处就是和xml相比,分散到各个class文件中,不方便修改.
用注解,需要在hibernate.cfg.xml文件中添加使用了注解的实体类的标签
<mapping class="com.test.pojo.Person"/>
二,有哪些注解,咋用?
1.先看示例代码:
@Entity @Table(name = "person_") public class Person { private int id; private String name; private int age; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "age") public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
这是一个简单的使用了注解进行映射的类,可以看到其中的注解所代表的含义.
类注解:
(1)@Entity: 表示这是一个实体类,用于映射一个表
(2)@Table(name="person"): 表示这个类映射的表的名字为person
属性注解:
(1)@Id: 表示这个属性是表中的主键
(2)@GeneratedValue(strategy = GenerationType.IDENTITY)表示主键的自增长方式
strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO
GenerationType.AUTO 主键由程序控制
GenerationType.TABLE 使用一个特定的数据库表格来保存主键
GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)
GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用)
generator 指定生成主键使用的生成器(可能是orcale中的序列)。
(3)@Column(name="id): 表示这个属性映射到表中的"id"字段
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)
table 可选,定义对应的表(默认为主表)
length 可选,列长度(默认值255)
precision 可选,列十进制精度(decimal precision)(默认值0)
scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
关系注解:
(1) @ManyToOne: 表示多对一关系, (注解下是一个对象的getter)
@JoinColumn(name="tid") 表示, 这个关系在表中对应的字段为tid
@Entity @Table(name = "person_") public class Person { private int id; private String name; private int age; private Teacher teacher; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "age") public int getAge() { return age; } public void setAge(int age) { this.age = age; } @ManyToOne @JoinColumn(name="tid") public Teacher getTeacher(){ return teacher; } public void setTeacher(Teacher teacher){ this.teacher = teacher } }
(2)@OneToMany(fetch=FetchType.EAGER): 一对多关系, FetchType表示是否延迟加载 (注解下是一个集合的getter)
@JoinColumn: 表示映射字段
@Entity @Table(name = "teacher_") public class Teacher { private int id; private String name; private Set<Person> persons; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(fetch=FetchType.EAGER) @JoinColumn(name="tid") public Set<Person> getPersons(){ return persons; } public void setPersons(Set<Person> persons){ this.persons = persons; } }
(3)@ManyToMany: 多对多注解
@JoinTable: 多对多关系映射的表
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) //表示级联方式和是否延迟加载 @JoinTable( //表示多对多关系的表的映射 name="user_product", //表名 joinColumns[email protected](name="uid"), inverseJoinColumns[email protected](name="pid") ) public Set<Product> getProducts() { return products; }
以上是关于Hibernate-注解的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate——主键生成策略CRUD 基础API区别的总结 和 注解的使用
具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包
用spring的@Validated注解和org.hibernate.validator.constraints.*的一些注解在后台完成数据校验