hibernate 注解的使用
搭建环境hibernate3.6使用注解开发和xml 开发导入jar包是一样的
hibernate注解主要 用来配置PO实体类(简化 hbm映射文件,但是cfg文件还是要写的)
1、单表配置 Book
@Entity 代表类是一个实体类生成数据表
@Table 设置生成表名
@Id 主键对应属性
@GeneratedValue 主键生成策略
@Column 配置普通列属性
以上注解来自javax.persistence.包下,Hibernate是JPA 实现,引入注解来自JPA
例:
@Entity
@Table(name = "book", catalog = "hibernate3day3" )
public class Book {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
//strategy 有四个取值,常用 AUTO、IDENTITY、SEQUENCE
//AUTO 会根据数据库选择 IDENTITY还是 SEQUENCE 类似 native
privateInteger id;
//通过@Column 注解指定属性 生成列名,列字段属性
//如果不写@Column 列名默认就是属性名
privateString name;
privateDouble price;
}
在hibernate.cfg.xml配置(这个还是必要的)
<mappingclass="cn.itcast.domain.Book"/>
注意 : @Id 主键对应属性 @GeneratedValue 主键生成策略 @Column 配置普通列属性,可以定义在类变量声明上方 或者 get方法上方都可以。
2、单表配置,自定义生成策略
例:使用UUID 主键生成策略
@Entity
@Table(name = "person")
public class Person {
@Id
//@GenericGenerator 由hibernate提供,使用hibernate生成策略
@GenericGenerator(name= "uuidGenerator ", strategy ="uuid")
//通过generator 引入自定义生成器
@GeneratedValue(generator = "uuidGenerator")
privateString id;
privateString name;
}
3、其它注解
@Temporal 控制日期格式输出
*DATE 将日期部分存入数据库
*TIME 将时间部分存入数据库
*TIMESTAME 将日期和时间都存入数据库
例:@Temporal(TemporalType .TIMESTAMP)
privateDate birthday;
@Transient 控制哪些属性不会输出到数据库,生成列
*默认Entity类中 所有属性生成数据库列,但指定了@Transient就不会生成到数据库了。
4、多表关联映射(一对多)
@Entity
@Table(name= "customer")
publicclass Customer {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
privateInteger id;
privateString name;
@OneToMany(targetEntity = Order.class,mappedBy = "customer")
privateSet<Order> orders = new HashSet<Order>();
}
@Entity
@Table(name= "orders")
publicclass Order {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
privateInteger id;
privateString address;
@ManyToOne(targetEntity= Customer.class)
//添加外键,name为外键列的列名
@JoinColumn(name ="customer_id")
privateCustomer customer;
}
如果抛出这样的异常有两种可能
java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval()Z
* 第一种可能调用一个不存在的方法
* 第二种可能,jar包冲突
对于与JPA冲突的jar为myeclipse中的javaee.jar ----- 删除javaee.jar 中 javax.persistence 包就行了
如何删除jar中的文件
在preferences中搜索lib,在javaEE5.0中对javaee.jar进行查看,然后拷贝到桌面,用压缩工具打开, 删除其中的包后再考回来覆盖就行了。
配置级联
@OneToMany(targetEntity= Order.class, mappedBy = "customer", orphanRemoval = true)
@Cascade (value = { CascadeType.ALL }) // 除了孤儿删除所有级联
privateSet<Order> orders = new HashSet<Order>();
5、 多对多关联关系映射
配置关系时,无需两边都配置中间表,只需要在任何一端配置,在另一端写mappedBy
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
privateInteger id;
privateString sname;
@ManyToMany(targetEntity= Course.class)
@JoinTable(name ="student_course", joinColumns = { @JoinColumn(name ="student_id") },inverseJoinColumns = { @JoinColumn(name ="course_id") })
privateSet<Course> courses = new HashSet<Course>();
}
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
privateInteger id;
privateString cname;
这一方不用配置中间表了
@ManyToMany(targetEntity= Student.class, mappedBy = "courses")
privateSet<Student> students = new HashSet<Student>();
}
6、配置检索策略有三个注解
@Fetch
@LazyCollection关联集合
@LazyToOne 关联单一对象
例:
public class Customer {
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.TRUE)
privateSet<Order> orders = new HashSet<Order>();
}
public class Order {
@Fetch(FetchMode.SELECT)
@LazyToOne(LazyToOneOption.FALSE)
privateCustomer customer;
}