JPA 对象关系映射总结

http://blog.sina.com.cn/s/blog_7045cb9e0100xch9.html


每个实体bean都要有个实体标识属性,这个实体标识属性主要用于在内存里面判断对象。通过@Id就可以

定义实体标识。可以标识在属性的get方法前面,也可以标识在字段上面,通常我们更倾向于标识在属性的get
方面上面。
如果我们希望采用数据库的id自增长的方式来生成主键值的话,这时候我们要用到一个注解
@GeneratedValue,这注解里面有一些属性,其中一个是策略strategy,生成主键值的方案,JPA里没有
Hibernate提供的那么多方案,它提供的方案有如下图:
JPA <wbr>对象关系映射总结(二)---JPA主键生成策略
◦ AUTO: JPA自动选择合适的策略,是默认选项;
◦ IDENTITY: 采用数据库ID自增长的方式来生成主键值,Oracle不支持这种方式;
◦ SEQUENCE: 通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支
持这种方式;
◦ TABLE: 采用表生成方式来生成主键值,那怎么样生成呢?很简单,表里面通常有两个字段,
第一个字段是给它一个名称(就是个列名而已),第二个字段专门用来累加用的,就是说每访
问一次这个表,第二个字段就会累加1,不断累加。就是说你们要得到这个主键值的话,访问这
个表,然后update这个表的这个字段,把它累加1之后,然后再把这个值取出来作为主键,再
给他赋进去,表生成就是这样。

◦ Oracle数据库默认情况下,不能支持用id自增长方式来生成主键值;
◦ mysql在默认情况下不能支持SEQUENCE序列的方式来生成主键值,所以我们一定要注意我们
使用的数据库。
◦ TABLE表生成方式才是通用的,但是这种方式效率并不高。
◦ 如果我们开发的应用,我们不可以预测用户到底使用哪种数据库,那么这个时候应该设为哪个
值呢?答案是AUTO,就是说由持久化实现产品,来根据你使用的方言来决定它采用的主键值
的生成方式,到底是IDENTITY?还是SEQUENCE?还是TABLE? 如果用的是Hibernate,那么
它会用IDENTITY这种生成方式来生成主键值。

摘自CSDN:
@GeneratedValue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最
适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。在
javax.persistence.GenerationType中定义了以下几种可供选择的策略:
1) IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle不支持这种方式;
2) AUTO: JPA自动选择合适的策略,是默认选项;
3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种
方式; 4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数
据库移植。不同的JPA实现商生成的表名是不同的,如 OpenJPA生成openjpa_sequence_table表
Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序
列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
可参考http://blog.csdn.net/lzxvip/archive/2009/06/19/4282484.aspx


实体bean开发完后,就要用持久化API对实体bean进行添删改查的操作,我们学习持久化API的时
候,可以对照Hibernate来学习,接下来建立个单元测试,在开发的过程中,建议大家一定要用单元测
试(junit可以用来进行单元测试)。
第一步写:persistence.xml(要求放在类路径的META-INF目录下)
如同前一篇:http://blog.sina.com.cn/s/blog_7045cb9e0100r5o1.html
第二步编写代码和单元测试:

@Entity //以javax开头的包,都是Sun公司制定的一些规范
public class Person {
private Integer id;
private String name;
public Person() {
/*对象是由Hibernate为我们创建的,当我们通过ID来获取某个实体的时候,这个实体给我们返回了这个对象的创}
public Person(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)//auto默认,可不写,直接写@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

public class PersonTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void save(){
//对实体bean进行操作,第一步应该获取什么对象啊? SessionFactory对象
//这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差EntityManagerFactoryfactory = Persistence.createEntityManagerFacto
ry("itcast");
//参数"itcast"是persistence.xml文件中<persistence-unit&nbsp;name="itcast">name的属性值EntityManagerem = factory.createEntityManager();
em.getTransaction().begin(); //开启事务
em.persist(new Person("传智播客")); //持久化对象
em.getTransaction().commit(); //提交事务
em.close();
factory.close();
//SessionFactory --> Session -->begin事务
}
}

目前数据库表是不存在的,我们采取实体(领域)建模的思想,让它根据实体bean来生成数据库表,在
persistence.xml里,<propertyname="hibernate.hbm2ddl.auto"value="update"/>,生成策略是
update,就是说表不存在的时候,它会创建数据库表。
问题,它什么时候创建表啊?创建表的时机是在什么时候创建的啊?答案是得到SessionFactory的时候,在
JPA里也一样,是我们得到EntityManagerFactory的时候创建表,也就是说我们只要执行下面的那段代码就生
成表了。
public class PersonTest {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值