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());

 

posted @ 2017-07-20 17:09  晓梦蝶  阅读(1561)  评论(0编辑  收藏  举报