一: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.没有缓存