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.没有缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值