JPA註解開發

JPA註解開發

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());
相關文章
相關標籤/搜索