Hibernate annotation 学习笔记(6)

2018-11-28 15:49

Hibernate—annotation 学习笔记 第26页 共109页

c) 实体类:(中引用了复合主键类) public class FiscalYearPeriod { d) FiscalYearPeriod.hbm.xml映射文件

private FiscalYearPeriodPK fiscalYearPeriodPK;//引用 复合主键类 private Date beginDate;//开始日期 private Date endDate;//结束日期 private String periodSts;//状态 public FiscalYearPeriodPK getFiscalYearPeriodPK() { } public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) { } this.fiscalYearPeriodPK = fiscalYearPeriodPK; return fiscalYearPeriodPK; ?????? e) 导出数据库输出SQL语句:

create table t_fiscalYearPeriod (fiscalYear integer not null, fiscalPeriod integer not null, beginDate datetime, endDate datetime, periodSts varchar(255), primary key (fiscalYear, fiscalPeriod))//实体映射到数据就是两个字段构成复合主键 f) 数据库表结构:

Hibernate—annotation 学习笔记 第27页 共109页

g) 复合主键关联映射数据存储:

h) 执行输出SQL语句:

Hibernate: insert into t_fiscalYearPeriod (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) 注:如果再存入相同复合主键的记录,就会出错。 i) 数据的加载:

数据加载非常简单,只是主键是一个对象而以,不是一个普通属性。

FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod(); session = HibernateUtils.getSession(); tx = session.beginTransaction(); //构造复合主键 FiscalYearPeriodPK pk = new FiscalYearPeriodPK(); pk.setFiscalYear(2009); pk.setFiscalPeriod(11); fiscalYearPeriod.setFiscalYearPeriodPK(pk);//为对象设置复合主键 fiscalYearPeriod.setEndDate(new Date()); fiscalYearPeriod.setBeginDate(new Date()); fiscalYearPeriod.setPeriodSts(\); session.save(fiscalYearPeriod);

2、annotation方式

下面是定义组合主键的几种语法:

将组件类注解为@Embeddable,并将组件的属性注解为@Id 将组件的属性注解为@EmbeddedId

将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id a) 将组件类注解为@Embeddable,并将组件的属性注解为@Id

组件类: @Embeddable public class TeacherPK implements java.io.Serializable{ } private int id; private String name; public int getId() {return id; } public void setId(int id) { this.id = id;} public String getName() { return name;} public void setName(String name) { this.name = name;} @Override public boolean equals(Object o) { @Override public int hashCode() { return this.name.hashCode(); } ??} Hibernate—annotation 学习笔记 第28页 共109页

将组件类的属性注解为@Id,实体类中组件的引用 @Entity public class Teacher { private TeacherPK pk; private String title; @Id public TeacherPK getPk() { }} b) 将组件的属性注解为@EmbeddedId

注意:只需要在实体类中表示复合主键属性前注解为@Entity,表示此主键是一个复合主键 注意了,复合主键类不需要任何的注意。 @Entity public class Teacher { private TeacherPK pk; private String title; @EmbeddedId public TeacherPK getPk() { }} c) 类注解为@IdClass,主键的属性都注解为@Id

需要将复合主键类建立好,不需要进行任何注解 在实体类中不需要进行复合主键类的引用

需要在实体类前面注解为@IdClass,并且指定一个value属性,值为复合主键类的class 需要在实体类中进行复合主键成员属性前面注解为@Id 如下: @Entity @IdClass(TeacherPK.class) public class Teacher { //private TeacherPK pk;//不再需要 private int id; private String name; @Id public int getId() {return id; } public void setId(int id) { this.id = id; } @Id public String getName() {return name;} public void setName(String name) {this.name = name; }} return pk; return pk; Hibernate—annotation 学习笔记 第29页 共109页

第14课 Hibernate核心开发接口(重点)

一、 Configuration(AnnotationConfiguration)

作用:进行配置信息的管理 目标:用来产生SessionFactory

可以在configure方法中指定hibernate配置文件,默认(不指定)时在classpath下加载hibernate.cfg.xml文件 加载默认的hibernate的配置文件

sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 加载指定hibernate的配置文件

sessionFactory=new nnotationConfiguration().configure(\).buildSessionFactory(); 只需要关注一个方法:buildSessionFactory(); 二、 SessionFactory

作用:主要用于产生Session的工厂(数据库连接池)

当它产生一个Session时,会从数据库连接池取出一个连接,交给这个Session

Session session = sessionFactory.getCurrentSession();

并且可以通过这个Session取出这个连接 关注两个方法:

getCurrentSession():表示当前环境没有Session时,则创建一个,否则不用创建 openSession():

表示创建一个Session(3.0以后不常用),使用后需要关闭这个Session

两方法的区别:

①、openSession永远是每次都打开一个新的Session,而getCurrentSession不是,是从上下文找、只有当前没有Session时,才创建一个新的Session

②、OpenSession需要手动close,getCurrentSession不需要手动close,事务提交自动close ③、getCurrentSession界定事务边界

所指的上下文是指hibernate配置文件(hibernate.cfg.xml)中的“current_session_context_class”所指的值:(可取值:jta|thread|managed|custom.Class)

thread 上下文:

常用的是:①、thread:是从上下文找、只有当前没有Session时,才创建一个新的Session,主要从数据界定事务

③、managed:不常用 ④、custom.Class:不常用

②、jta:主要从分布式界定事务,运行时需要Application Server来支持(Tomcat不支持)

三、 Session

1、 管理一个数据库的任务单元 2、 save();

session.save(Object) session的save方法是向数据库中保存一个对象,这个方法产生对象的三种状态 3、 delete()

session.delete(Object) Object对象需要有ID

对象删除后,对象状态为Transistent状态 4、 load()

格式: Session.load(Class arg0, Serializable arg1) throws HibernateException

* arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):例\字符串已经实现了序列化

Hibernate—annotation 学习笔记 第30页 共109页

接口。如果是数值类类型,则hibernate会自动使用包装类,例如 1 * 此方法返回类型为Object,但返回的是代理对象。

* 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。 * 因为load方法实现了lazy(称为延迟加载、赖加载)

* 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句) * hibernate延迟加载实现原理是代理方式。

* 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException) try { }

session = sf.openSession(); session.beginTransaction(); User user = (User)session.load(User.class,1); //只有在使用对象时,它才发出查询SQL语句,加载对象。 System.out.println(\ + user.getName()); //因为此的user为persistent状态,所以数据库进行同步为龙哥。 user.setName(\发哥\); session.getTransaction().commit(); e.printStackTrace(); session.getTransaction().rollback(); if (session != null){ } if (session.isOpen()){ } session.close(); } catch (HibernateException e) { } finally{ 5、 Get()

格式:Session.get(Class arg0, Serializable arg1)方法 * arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):

例\字符串已经实现了序列化接口。如果是基数类型,则hibernate会自动转换成包装类,如 1

返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

如果数据不存在,则返回null;

注:执行此方法时立即发出查询SQL语句。加载User对象 加载数据库中存在的数据,代码如下:

try { session = sf.openSession(); session.beginTransaction(); * 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。 如果数据不存在,则返回null * 执行此方法时立即发出查询SQL语句。加载User对象。


Hibernate annotation 学习笔记(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:儿童文明礼仪小故事(共4篇)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: