Hibernate的注解开发

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 有四个取值,常用 AUTOIDENTITYSEQUENCE

         //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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值