`
ligf06
  • 浏览: 101885 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JPA介绍

    博客分类:
  • JPA
阅读更多
    一:JPA映射 
    @Entity -->把一个类映射成数据库表 ,默认值就是类名 
    @Entity(name="xxx") -->把一个类映射成数据库表 ,表名就是xxx 
    @Table(name="yyy")-->把一个类映射成数据库表 ,表名就是yyy 
    @Column(length=4,name="userName",nullable=false)-->  
       length-->表字段的长度是4,   
       name=-->表字段的列名是userName, 
       nullabl-->列不允许为空,等于true就是可以为空 
    @Id @GeneratedValue-->  主键并自动增长 
    @Temporal(TemporalType.TIMESTAMP)--> 设置时间格式   
      TIMESTAMP-->2010-10-10 10:10:10 
      DATE-->2010-10-10 
      TIME--> 10:10:10 
     @Enumerated(EnumType.ORDINAL)-->枚举类型 
      EnumType.ORDINAL -->表是用枚举的索引 
      EnumType.STRING -->表是用枚举的名字 
     @Lob-->长文本类型或(byte)字节类型 
     @Transient-->不映射成数据库的列名 
     @Basic(fetch=FetchType.LAZY)-->一般读取大的数据时使用 
       FetchType.LAZY--> 延迟加载,获取时必须在EntityManager打开或session.openSession()时,才可以用,不然会报错 
       FetchType.EAGER--> 立即加载 
     
    二: EntityManager  method 讲解 
        EntityManager.find(class,Object) //相当hibernate  get() 
        EntityManager.getReference(class,Object) //相当hibernate  load()  
        //延迟加载,获取时必须在EntityManager打开或session.openSession()时,才可以用,不然会报LazyInitialException() 
        JPA四种状态 
        new-->新建     User user=new User("zhang"); 
        managed-->脱管 EntityManager.getTransation().begin();打开,这时候处于脱管状态;  如果这时用user.setName("san") ;是可以更新到数据库里面的; 
        free-->游离        EntityManager.clear()后;这时处于游离状态,这时如果要更新要用   EntityManager.merge(Object)方法; 
        delte-->删除           EntityManager.remove()时; 
     
    三:  JPQL 
            1.查询     (:name)位置符查询和(?1)命名参数查询 
        2.Query query=EntityManager.createQuery("select * from User"); 
           query.getResultList();   //所有 
        3.Query query=EntityManager.createQuery("select count(*) from User"); 
           query.getSingleResult();   //单个  相当hibernate 的session.createQuery().uniqueResult() 方法; 
        4.query.execute();query.executeUpdate(); 
         
           
     四:一对多的双向关系维护 
        eg: 
        Order(订单)OrderItem(订单项)的关系 
        Order  就是关系被维护端 
        OrderItem   就是关系维护端,因为这边多,多得一方是关系维护端 
        Order  set<OrderItem> set=new HashSet<OrderItem>(); 
        OrderItem  Order order;  
        Order(订单) @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="order") 
         //因为OrderItem是关系维护端, Order  就是关系被维护端 ,mappedBy指向那边,那边就是关系被维护端, 
         //Order需要OrderItem中的order来维护两边的关系,因为 Order中的每一项都是OrderItem, 
         //OrderItem  表示主键 
         //Order 中的orderItemId引用了OrderItem 的id 
         //mappedBy="order"相当与hibernate inverse=true 
        cascade  -->级联 
            CascadeType.MERGE,     -->当对象处于游离状态时,调用EntityManager.merge()时才有用;如下全都一样,但是状态不一样 
            CascadeType.PERSIST, 
            CascadeType.REFRESH, 
            CascadeType.REMOVE ,    
            CascadeType.ALL 时,表是所有状态  
        mappedBy  表示谁是关系的被维护端, 
        oneToMany //To后面的单词是many表示延迟加载,反之是 FetchType.EAGER--> 立即加载 
        fetch=FetchType.LAZY  //默认是懒加载模式 
        optional=true   //表示可以为NULL ,反之不可以为NULL 
        @JoinColumn(name="order_id") //表示外键名称 
        @JoinTable(name="student_teacher",inverseJoinColumns=@JoinColumn(name="teacher_id"),joinColumns=@JoinColumn(name="student_id"))   
        //@JoinTable  表示中间表 
        //name        表示中间表的表名 
        //inverseJoinColumns=@JoinColumn(name="teacher_id")  表示被维护端在中间表的外键列名 
        //joinColumns=@JoinColumn(name="student_id")         表示维护端在中间表的外键列名 
    五:  联合主键 
         1.必须有一个public无参的构造函数 
         2.必须实现Serializable 
         3.必须重写主键类的hasCode()、equals()方法,必须用复合主键的字段来作为判断这个对象是否相等; 
        @Embeddable  元数据,表示只使有里面的字段属性; 将嵌入式主键类使用@Embeddable标注,表示这个是一个嵌入式类。 
    六:  JPA缺点 
         1.没有index注解 
         2.没有缓存 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics