jpa是sun公司的一個ORM規範,只有接口和註解,沒有具體實現。session
jpa是EJB3中的。app
書寫註解,並配置
測試
@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.xmlfetch
<!-- 映射配置文件 --> <mapping class="cn.it.entity.Book"/>
主鍵相關的:ui
Auto至關與native,默認值spa
自定義主鍵策略(下面使用hibernate的實現):hibernate
屬性字段官方參考配置:代理
註解:能夠放到屬性上面設置,也能夠在getter方法上設置,效果同樣。code
新建訂單表實體類,並與客戶表創建實體關係。xml
@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());