Hibernate是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。

Hibernate与目标是怎么同事的呢?Hibernate是完好的目标/联系映射解决计划,它供给了目标状况办理(state management)的功用,使开发者不再需求理睬底层数据库体系的细节。

开始了解Hibernate与目标同事  Hibernate 对象 第1张

也就是说,相对于常见的JDBC/SQL耐久层计划中需求办理SQL句子,Hibernate采用了更天然的面向目标的视角来耐久化Java运用中的数据。

换句话说,运用Hibernate的开发者应该总是重视目标的状况(state),不用考虑SQL句子的履行。这部分细节已经由Hibernate掌管稳当,只要开发者在进行体系功用调优的时分才需求进行了解。

1. Hibernate目标状况(object states)

Hibernate界说并支撑下列目标状况(state):

瞬时(Transient) - 由new操作符创立,且没有与Hibernate Session 相关的目标被认定为瞬时(Transient)的。瞬时(Transient)目标不会被耐久化到数据库中,也不会被赋予耐久化标识(identifier)。假如程序中没有坚持对瞬时(Transient)目标的引证,它会被废物收回器(garbage collector)毁掉。运用Hibernate Session能够将其变为耐久(Persistent)状况。(Hibernate会主动履行必要的SQL句子)

耐久(Persistent) - 耐久(Persistent)的实例在数据库中有对应的记载,并具有一个耐久化标识(identifier)。 耐久(Persistent)的实例或许是刚被保存的,或刚被加载的,不管哪一种,按界说目标都仅在相相关的Session生命周期内的坚持这种状况。

Hibernate会检测到处于耐久(Persistent)状况的目标的任何改动,在当时操作单元(unit of work)履行结束时将目标数据(state)与数据库同步(synchronize)。开发者不需求手动履行UPDATE。将目标从耐久(Persistent)状况变成瞬时(Transient)状况相同也不需求手动履行DELETE句子。

脱管(Detached) 与耐久(Persistent)目标相关的Session被封闭后,目标就变为脱管(Detached)的。对脱管(Detached)目标的引证仍然有用,目标可持续被修正。脱管(Detached)目标假如从头相关到某个新的Session上, 会再次转变为耐久(Persistent)的(Detached其间的改动将被耐久化到数据库)。

这个功用使得一种编程模型,即中心会给用户考虑时刻(user think-time)的长时刻运转的操作单元(unit of work)的编程模型成为或许。 咱们称之为运用程序业务,即从用户观念看是一个操作单元(unit of work)。

接下来咱们来详尽的评论下状况(states)及状况间的转化(state transitions)(以及触发状况转化的Hibernate办法)。

2. 使目标耐久化

Hibernate以为耐久化类(persistent class)新实例化的目标是瞬时(Transient)的。咱们可将瞬时(Transient)目标与session相关而变为耐久(Persistent)的。

  1. DomesticCatfritz=newDomesticCat();
  2. fritz.setColor(Color.GINGER);
  3. fritz.setSex('M');
  4. fritz.setName("Fritz");
  5. LonggeneratedId=(Long)sess.save(fritz);

假如Cat的耐久化标识(identifier)是generated类型的,那么该标识(identifier)会主动在save()被调用时发生并分配给cat。假如Cat的耐久化标识(identifier)是assigned类型的,或是一个复合主键(composite key),那么该标识(identifier)应当在调用save()之前手动赋予给cat。 你也能够依照EJB3 early draft中界说的语义,运用persist()代替save()。

此外,你能够用一个重载版别的save()办法。

  1. DomesticCatpk=newDomesticCat();
  2. pk.setColor(Color.TABBY);
  3. pk.setSex('F');
  4. pk.setName("PK");
  5. pk.setKittens(newHashSet());
  6. pk.addKitten(fritz);
  7. sess.save(pk,newLong(1234));

假如你耐久化的目标有相关的目标(associated objects)(例如上例中的kittens调集)那么对这些目标(译注:pk和kittens)进行耐久化的次序是恣意的(也就是说能够先对kittens进行耐久化也能够先对pk进行耐久化),除非你在外键列上有NOT NULL束缚。 Hibernate不会违背外键束缚,可是假如你用过错的次序耐久化目标(译注:在pk耐久之前耐久kitten),那么或许会违背NOT NULL束缚。

一般你不会为这些细节烦心,由于你很或许会运用Hibernate的传达性耐久化(transitive persistence)功用主动保存相相关那些目标。 这样连违背NOT NULL束缚状况都不会呈现了Hibernate会管好一切的工作。传达性耐久化(transitive persistence)将在本章稍后评论。

3. 装载目标

假如你知道某个实例的耐久化标识(identifier),你就能够运用Session的load()办法 来获取它。 load()的另一个参数是指定类的.class目标。 本办法会创立指定类的耐久化实例,并从数据库加载其数据(state)。

  1. Catfritz=(Cat)sess.load(Cat.class,generatedId);
  2. //youneedtowrapprimitiveidentifiers
  3. longpkId=1234;
  4. DomesticCatpk=(DomesticCat)sess.load(Cat.class,newLong(pkId));

此外, 你能够把数据(state)加载到指定的目标实例上(覆盖掉该实例本来的数据)。

  1. Catcat=newDomesticCat();
  2. //loadpk'sstateintocat
  3. sess.load(cat,newLong(pkId));
  4. Setkittens=cat.getKittens();

请留意假如没有匹配的数据库记载,load()办法或许抛出无法康复的反常(unrecoverable exception)。 假如类的映射运用了署理(proxy),load()办法会回来一个未初始化的署理,直到你调用该署理的某办法时才会去拜访数据库。 若你期望在某目标中创立一个指向另一个目标的相关,又不想在从数据库中装载该目标时一起装载相相关的那个目标,那么这种操作办法就用得上的了。 假如为相应类映射联系设置了batch-size, 那么运用这种操作办法答应多个目标被一批装载(由于回来的是署理,无需从数据库中抓取一切目标的数据)。

假如你不确定是否有匹配的行存在,应该运用get()办法,它会马上拜访数据库,假如没有对应的行,会回来null。

  1. Catcat=(Cat)sess.get(Cat.class,id);
  2. if(cat==null){
  3. cat=newCat();
  4. sess.save(cat,id);
  5. }
  6. returncat;

你乃至能够选用某个LockMode,用SQL的SELECT ... FOR UPDATE装载目标。 请查阅API文档以获取更多信息。

  1. Catcat=(Cat)sess.get(Cat.class,id,LockMode.UPGRADE);

留意,任何相关的目标或许包括的调集都不会被以FOR UPDATE办法回来, 除非你指定了lock或许all作为相关(association)的级联风格(cascade style)。

任何时分都能够运用refresh()办法逼迫装载目标和它的调集。假如你运用数据库触发器功用来处理目标的某些特点,这个办法就很有用了。

  1. sess.save(cat);
  2. sess.flush();//forcetheSQLINSERT
  3. sess.refresh(cat);//re-readthestate(afterthetriggerexecutes)

此处一般会呈现一个重要问题: Hibernate会从数据库中装载多少东西?会履行多少条相应的SQLSELECT句子? 这取决于抓取战略(fetching strategy),这儿咱们不再做以解说。

【修改引荐】

  1. 简述Hibernate中加载并存储目标
  2. Hibernate传达性耐久化攻略
  3. 深化了解Hibernate主动状况检测
  4. 教你怎么在Hibernate中实例化调集和署理
  5. Hinerbate单端相关署理颇析
转载请说明出处
知优网 » 开始了解Hibernate与目标同事

发表评论

您需要后才能发表评论