首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

EJB3.0实业的注解规范(转载)

2012-10-10 
EJB3.0实体的注解规范(转载)EJB3为延迟加载和获取模式提供了 fetch选项,而Hibernate在这方面提供了更丰富

EJB3.0实体的注解规范(转载)

EJB3为延迟加载和获取模式提供了 fetch选项,而Hibernate在这方面提供了更丰富的选项集.为了更好的调整延迟加载和获取策略,Hibernate引入了一些附加的注解:             @LazyToOne: 定义了              @ManyToOne 和 @OneToOne             关联的延迟选项. LazyToOneOption 可以是             PROXY (例如:基于代理的延迟加载),             NO_PROXY (例如:基于字节码增强的延迟加载 - 注意需要在构建期处理字节码)             FALSE (非延迟加载的关联)                @LazyCollection: 定义了             @ManyToMany和 @OneToMany              关联的延迟选项. LazyCollectionOption可以是             TRUE (集合具有延迟性,只有在访问的时候才加载),              EXTRA (集合具有延迟性,并且所有的操作都会尽量避免加载集合,对于一个巨大的集合特别有用,              因为这样的集合中的元素没有必要全部加载)和              FALSE(非延迟加载的关联) 下面例子对LazyCollectionOption的举例说明: /**********一方********/ @Entity public class WorkGroup{        private String poid;                ......         private List<WorkGroupMachine> works = new ArrayList<WorkGroupMachine>;                ........         @OneToMany(mappedBy = "workGroup", fetch = FetchType.LAZY, cascade ={CascadeType.ALL})        @LazyCollection(LazyCollectionOption.TRUE)        @org.hibernate.annotations.Cascad(value=  org. hibernate.annotations.CascadeType.DELETE_ORPHAN)       @org.hibernate.annotations.Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)         public List<WorkGroupMachine> getWorkGroupMachines() {                          return workgrupMachines;        } } /***********多方*****************/ @Entity public class WorkGroupMachine{          private WorkGroup workGroup;                   ...........         @ManyToOne(fetch = FetchType.LAZY)          @JoinColumn(name = "WorkGroupId", nullable = false)         public WorkGroup getWorkGroup() {                  return workGroup;           } } 如下为test case: public void testWork(){    WorkGroup group = workGroupEao.findByPoid(getPOID());    group.getWorkGroupMachines().size(); } console output: select * from WorkGroup w where w.poid = ?; select * from WroupMachine m where m.work_fk = ?; 可见如果LazyCollectionOption.TRUE,在获取size()时,会进行全体查询.并都加载到内存中. 如把上面LazyCollectionOption.EXTRA,后console output: select * from WorkGroup w where w.poid = ?; select count(*) from WroupMachine m where m.work_fk = ?; 此时在内存中不存在WroupMachine的数据,只有在下次request时,如 group.getWorkGroupMachines().get(0).getName()时,才会真正的获取记录到内存中. 下面为对Fetch的用法:    @Fetch:     定义了加载关联关系的获取策略. FetchMode 可以是      SELECT (在需要加载关联的时候触发select操作),     SUBSELECT(只对集合有效,使用了子查询策略,详情参考Hibernate参考文档)      JOIN (在加载主实体(owner entity)的时候使用SQL JOIN来加载关联关系).     JOIN 将覆写任何延迟属性 (通过 JOIN策略加载的关联将不再具有延迟性). 

热点排行