JPA注解开发
JPA注解开发
jpa是sun公司的一个ORM规范,只有接口和注解,没有具体实现。
jpa是EJB3中的。
单表常用注解
书写注解,并配置
@Entity @Table(name = "c_book") public class Book { @Id //主键策略 // @GeneratedValue(strategy=GenerationType.AUTO)//native @GenericGenerator(name="wc",strategy="uuid") @GeneratedValue(generator="wc")//生成uuid private String id; @Column(name="cname",length=20,nullable=false,unique=true)
配置Hibernate.cfg.xml
<!-- 映射配置文件 --> <mapping class="cn.it.entity.Book"/>
主键相关的:
Auto相当与native,默认值
自定义主键策略(下面使用hibernate的实现):
属性字段官方参考配置:
注解:可以放到属性上面设置,也可以在getter方法上设置,效果一样。
多表常用注解
一对多
新建订单表实体类,并与客户表建立实体关系。
@Entity @Table(name="w_customer") @NamedQuery(name="Customer.findAll",query="from Customer") @NamedQueries(value=@NamedQuery(name="Customer.findAll2",query="from Customer")) public class Customer { @Id @GeneratedValue private Integer id; private String name; private String city; @OneToMany(mappedBy="customer",//by 1 的一方 :在Order实体类中属性customer cascade=CascadeType.ALL,//级联 不包含 all-delete-orphan fetch=FetchType.LAZY,//懒加载 orphanRemoval=true,//支持孤儿删除 delete-orphan targetEntity=cn.it.entity.Order.class//一般忽略 ,Order是接口的化,这里配置实现类的指定 ) private Set<Order> orders = new HashSet<Order>();
--------------------------------------------------------------------------------------------------------------------------------------------
@Entity @Table(name="w_order")//表名 public class Order { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; private String name; private Double price; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="c_id")//自定义关联外键属性 映射表中字段名为c_id 覆盖了默认的customer_id @Fetch(FetchMode.SELECT)//单表查询 @LazyToOne(LazyToOneOption.PROXY)//代理懒加载 private Customer customer;
核心配置
<mapping class="cn.it.entity.Order"/> <mapping class="cn.it.entity.Customer"/>
多对多
示例:学生和课程
@Entity @Table(name="t_course") public class Course { //注解主键 @Id @GenericGenerator(name="wc",strategy="assigned") @GeneratedValue(generator="wc")//生成随机数 private Integer id; private String name; @ManyToMany @JoinTable(name="t_student_course",//配置中间表 joinColumns=@JoinColumn(name="c_id"),//自定义关系表name inverseJoinColumns=@JoinColumn(name="s_id")//对方的外键名称 ) private Set<Course> course=new HashSet<Course>();
--------------------------------------------------------------------------------------------------------------------------------------------
@Entity @Table(name="t_student") public class Student { //注解主键 @Id @GenericGenerator(name="wc",strategy="assigned") @GeneratedValue(generator="wc")//生成随机数 private Integer id; private String name; @ManyToMany @JoinTable(name="t_student_course",//配置中间表 joinColumns=@JoinColumn(name="s_id"),//自定义关系表name inverseJoinColumns=@JoinColumn(name="c_id")//对方的外键名称 ) private Set<Course> course=new HashSet<Course>();
核心配置
<mapping class="cn.it.entity.Student"/> <mapping class="cn.it.entity.Course"/>
命名查询
@NamedQueries(value={ @NamedQuery(name="Customer.findAll",query="from Customer"), @NamedQuery(name="Customer.findAll2",query="from Customer") })
测试:
List<Customer> list = session.getNamedQuery("Customer.findAll").list();
System.out.println(list.get(0).getOrders());