JPA2之java学习

 

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

你可能感兴趣的:(Java学习)