??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一卡2卡3卡4卡国产网站,亚洲av片不卡无码久久,久久亚洲国产午夜精品理论片http://www.tkk7.com/sailor/category/32872.html在一|情q日子里,谁能说得清是苦是甜,只知道确定了׃无反?/description>zh-cnMon, 14 Jul 2008 10:36:31 GMTMon, 14 Jul 2008 10:36:31 GMT603、EJB3.0开发指南之SessionBeanQ下Q?--------有状态会话Beanhttp://www.tkk7.com/sailor/articles/214709.htmlsailorsailorMon, 14 Jul 2008 05:51:00 GMThttp://www.tkk7.com/sailor/articles/214709.htmlhttp://www.tkk7.com/sailor/comments/214709.htmlhttp://www.tkk7.com/sailor/articles/214709.html#Feedback0http://www.tkk7.com/sailor/comments/commentRss/214709.htmlhttp://www.tkk7.com/sailor/services/trackbacks/214709.html
        和无状态会话Bean一P一个有状态会话Bean必须有一个业务接口,q个接口׃话Bean来实玎ͼ或者也可以׃话Bean来生。这P你可以只写一个文Ӟ可以生成业务逻辑实现cR远E接口、本地接口等?

  在目前jboss的实CQ必要有一个独立的业务接口?

  q个接口不必实现EJBObject或者EJBLocalObject?

  一个有状态会话Bean 必须使用Statelfull注释Q以表明它是一个有状态的会话Bean。EJB容器根据这个注释来判定它的cd。或者实现javax.ejb.SessionBean接口?

  一个有状态的会话Bean可以实现setSessionContextҎQ也可以不实现?

  在EJB2.0中调用EJBObject.removeҎ以达C容器中删除有状态会话Bean的功能。在EJB3.0中只需在一些方法加上Remove注释。一旦这些被标记的方法被调用后,此EJB从容器中删除?

  一个有状态的会话Bean可以通过依赖注入获取容器的资源和环境属性?

  ?a target="_blank">Eclipse中导入本文提供的例子Stateful?

  q个例子和无状态会话Bean的例子类|下面只列Z不同的代码?

  q个例子主要?个文Ӟ

   Counter.javaQ业务接口?

   CounterBean.javaQ业务实现类。将来我们开发的EJB也都是这样命名(在接口名上加上BeanQ?

   Client.javaQ测试EJB的客LcR?

   jndi.propertiesQjndi属性文Ӟ提供讉Kjdni的基本配|属性?

   Build.xmlQant 配置文gQ用以编译、发布、测试、清除EJB?

  下面针对每个文g的内容做一个介l?nbsp;

        Counter.java
 1import javax.ejb.Remove; 
 2  …… 
 3  @Remote 
 4
 5  public interface Counter 
 6  
 7  …… 
 8  @Remove 
 9  public void clean(); 
10  }
 
11


        

        q个接口很简单,和无状态会话Bean基本相同Q但新增加了一个CleanҎQƈ为此Ҏ加上Remove注释。一旦此Ҏ被执行完毕,此Bean被从容器中删除?

  JBOSS默认使用接口的全UC为它的JNDI名。在上面的例子中Q它的全U就是:com.kuaff.ejb3.stateful.CounterQ你也可以通过Counter.class得到?

  CounterBean.java 

 1  import javax.ejb.Stateful; 
 2  …… 
 3  @Stateful 
 4
 5  public class CounterBean implements Counter 
 6  
 7  //增加事务支持 
 8  @Tx(TxType.REQUIRESNEW) 
 9  public int getNumber() 
10  
11  return number; 
12  }
 
13
14  @Remove 
15
16  public void clean() 
17  
18  System.out.println("我,被删除了!"); 
19  }
 
20  }
 


  q个是计数器的实现类。注意这个类使用Stateful做了注释Q这是必ȝ。同Ӟq个例子也演CZ如何使用事务。事务的详细用法在后面的章节中介绍?nbsp;

        Client.java

 1package com.kuaff.ejb3.stateful; 
 2
 3  import javax.ejb.EJBException; 
 4  import java.rmi.NoSuchObjectException; 
 5  import javax.naming.InitialContext; 
 6  import javax.naming.NamingException; 
 7
 8  public class Client 
 9  
10  public static void main(String[] args) 
11  
12  InitialContext ctx; 
13  try 
14  
15   ctx = new InitialContext(); 
16   Counter counter = (Counter) ctx.lookup(Counter.class.getName()); 
17   counter.add(10); 
18   System.out.println("当前的number:" + counter.getNumber()); 
19   counter.add(10); 
20   System.out.println("当前的number:" + counter.getNumber()); 
21   Counter counter2 = (Counter) ctx.lookup(Counter.class.getName()); 
22   counter2.add(10); 
23   System.out.println("当前的number:" + counter2.getNumber()); 
24   //删除 
25   counter2.clean(); 
26   //下面如果再用counter2,出?nbsp;
27try 
28   
29    System.out.println("当前的number:" + counter2.getNumber()); 
30   }
 
31   catch(EJBException ex) 
32   
33    if (ex.getCausedByException() instanceof NoSuchObjectException) 
34    
35     System.out.println("我都被删除啦Q还找我Q?/span>"); 
36    }
 
37    else 
38    
39     throw ex; 
40    }
 
41   }
 
42  }
 
43  catch (NamingException e) 
44  
45   e.printStackTrace(); 
46  }
 
47  }
 
48  }
 
49

 

        q个cȝ来测试我们发布的计数器EJB。首先通过

  ctx = new InitialContext();得到上下文,然后通过lookup查找计数器,然后l计数器?0Q显C当前的计数器信息。最后调用CleanҎQ一旦这个方法执行完毕,此EJB从容器中删除,在用这个EJB会出现异常?

  误行{$JBOSS_HOME}/bin目录下的run.bat: run ?call,启动JBOSS?

  ?a target="_blank">Eclipse的Ant视图中执行ejbjar target。或者在命o行下Q进入到此工E目录下Q执行ant ejbjar,编译打包发布此EJB?

  在Eclipse的Ant视图中执行run target。或者在命o行下Q进入到此工E目录下Q执行ant run,试q个EJB?/p>

 



sailor 2008-07-14 13:51 发表评论
]]>
2、EJB3.0开发指南之Session Bean(?--------无状态会话Beanhttp://www.tkk7.com/sailor/articles/214706.htmlsailorsailorMon, 14 Jul 2008 05:36:00 GMThttp://www.tkk7.com/sailor/articles/214706.htmlhttp://www.tkk7.com/sailor/comments/214706.htmlhttp://www.tkk7.com/sailor/articles/214706.html#Feedback0http://www.tkk7.com/sailor/comments/commentRss/214706.htmlhttp://www.tkk7.com/sailor/services/trackbacks/214706.html阅读全文

sailor 2008-07-14 13:36 发表评论
]]>
1、JavaBean(EJB) 3.0 全新体验http://www.tkk7.com/sailor/articles/214704.htmlsailorsailorMon, 14 Jul 2008 05:24:00 GMThttp://www.tkk7.com/sailor/articles/214704.htmlhttp://www.tkk7.com/sailor/comments/214704.htmlhttp://www.tkk7.com/sailor/articles/214704.html#Feedback0http://www.tkk7.com/sailor/comments/commentRss/214704.htmlhttp://www.tkk7.com/sailor/services/trackbacks/214704.htmlhttp://dev.rdxx.com/Java/EJB/2007/12/2213122560946.shtml
        引言

  期待以久的EJB3.0规范在最q发布了它的初稿。在本文中将Ҏ的规范进行一个概要性的介绍Q包括新增的元数据支持,EJBQL的修改,实体Bean模型讉Kbean上下文的新方法和q行时环境等{。作者还讨论了EJB在未来要作出的调整以及EJB3.0与其他开发规范之间的关系?

  开?

  无论如何׃EJB的复杂性之在J2EE架构中的表现一直不是很好。EJB大概是J2EE架构中唯一一个没有兑现其能够单开发ƈ提高生力的l徏。EJB3.0规范正尝试在q方面作出努力以减轻其开发的复杂性。EJB3.0减轻了开发h员进行底层开发的工作量,它取消或最化了很多(以前q些是必d玎ͼ回调Ҏ的实玎ͼq且降低了实体Bean及O/R映射模型的复杂性?

  在本文中Q我首先会介lEJB3.0中几个主要的改变。它对进一步深入了解EJB3.0是非帔R要的。随后,我会从更高的层面来描q已l被提交到EJB3.0规范中的l节Qƈ一个个的讲解新的规范中的改变:实体Bean,O/R映射模型Q实体关pL型和EJB QL(EJB查询语言){等?

  背景

  EJB3.0中两个重要的变更分别是:使用了Java5中的E序注释工具和基?a target="_blank">Hibernate的O/R映射模型?

  Java5中的元数据工?/strong>

  Java5Q以前叫J2SE1.5或TigerQ中加入了一U新的程序注释工兗通过q个工具你可以自定义注释标记Q通过q些自定义标记来注释字段、方法、类{等。这些注释ƈ不会影响E序的语义,但是可以通过工具Q编译时或运行时Q来解释q些标记q生附加的内容Q比如部|描q文ӞQ或者强制某些必ȝq行时行为(比如EJBlg的状态特性)。注释的解析可以通过源文件的解析Q比如编译器或这IDE工具Q或者用Java5中的APIs反射机制。注释只能被定义在源代码层。由于所有被提交到EJB3.0草案中的注释标记都有一个运行时的RetentionPolicyQ因此会增加cL件占用的存储I间Q但q却l容器制造商和工具制造商带来了方ѝ?

  Hibernate

  目前Hibernate非常受欢q,它是开发源代码的Java O/R映射框架Q目的是把开发h员从J琐的数据持久化~程中解脱出来。它也有一个标准的HQLQHibernate 查询语言Q语aQ你可以在新的EJB QL中看到它的媄子。Hibernate在处理如数据查询、更新、连接池、事务处理、实体关pd理等斚w非常单?

  概览
  
  在已l提交的EJB3.0规范中主要涉及两个方面的改变Q?

  1. 一套以注释为基的EJB~程模型Q再加上EJB2.1中定义的通过部v描述W和几个接口定义的应用程序行为?

  2. 新的实体Bean持久化模型,EJBQL也有许多重要的改变?

  q有一些有关上q的提议Q比如:一个新的客L~程模型Q业务接口的使用以及实体Bean的生命周期。请注意EJB2.1~程模型Q包括部|描q符和home/remote接口Q仍然是有效的。新的简化模型ƈ没有完全取代EJB2.1模型?

  EJB注释

  EJB规范l织一个重要的目标是减d始代码的数量Qƈ且他们ؓ此给Z一个完而简介的办法。在EJB3.0的里QQ何类型的企业UBean只是一个加了适当注释的简单Java对象(POJO)。注释可以用于定义bean的业务接口、O/R映射信息、资源引用信息,效果与在EJB2.1中定义部|描q符和接口是一L。在EJB3.0中部|描q符不再是必ȝ了;home接口也没有了Q你也不必实C务接口(容器可以Z完成q些事情Q?

  比如Q你可以使用@Stateless注释标记cLJavacd明ؓ一个无状态回话bean。对于有状态回话bean来说Q@Remove注释可以用来标记一个特定的ҎQ通过q个注释来说明在调用q个Ҏ之后bean的实例将被清除掉?

  Z减少描述lg的说明信息,规范l织q采U了由异常进行配|(configuration-by-exceptionQ的手段Q意思是你可以ؓ所有的注释提供一个明的~省|q样多数常规信息可以据此推断得出?

  新的持久化模?/strong>

  新的实体bean也是一个加了注释的单Java对象(POJO)。一旦它被EntityManager讉K它就成ؓ了一个持久化对象Qƈ且成Z持久化上下文QcontextQ的一部分。一个持久化上下文与一个事务上下文是松耦合的;严格的讲Q它隐含的与一个事务会话共存?

  实体关系也是通过注释来定义的QO/R映射也是Qƈ提供几种不同?a target="_blank">数据?/a>规范操作Q在EJB2.1中这些要通过开发h员自q设计模式或者其它技术来完成的(比如Q自增长主键{略Q?

  深入研究

  现在是时候详l了解EJB3.0草案了。让我们开始探讨所有EJB中四U企业beanQƈ看看他们在新的规范中是什么样子?

  无状态回话bean

  在EJB3.0规范中,写一个无状态回话bean(SLSB)只需要一个简单的Java文gq在cd加上@Stateless注释可以了。这个bean可以扩展javax.ejb.SessionBean接口Q但q些不是必须的?

  一个SLSB不再需要home接口Q没有哪cEJB再需要它了。Beancd以实C务接口也可以不实现它。如果没有实CQ何业务接口,业务接口会由Lpublic的方法生。如果只有几个业务方法会被暴露在业务接口中,q些Ҏ可以使用@BusinessMethod注释。缺省情况下所有生的接口都是localQ本圎ͼ接口Q你也可以用@Remote注释来声明这个接口ؓremoteQ远E)接口?

  下面的几行代码就可以定义一个HelloWorldbean了。而在EJB2.1中同Lbean臛_需要两个接口,一个实现类和几个空的实现方法,再加上部|描q符?

  import javax.ejb.*;

  /**
  * A stateless session bean requesting that a remote business
  * interface be generated for it.
  */
  @Stateless
  @Remote
  public class HelloWorldBean {
  public String sayHello() {
  return "Hello World!!!";
  }
  }

   有状态回话bean

  除了几个SFSB的特别说明之外,有状态回话bean(SFSB)和SLSB一LQ?

   一个SFSB应该有一个方法来初始化自己(在EJB2.1中是通过ejbCreate()来实现的Q。在EJB3.0的规范中q些初始化操作可以通过自定义方法完成,q把他们暴露在业务接口中。在使用q个bean之前由客L来调用相应的初始化方法。目前规范组l就是否提供一个注释来标记某个Ҏ用于初始化还存在争议?

   Bean的提供者可以用@Remove注释来标CQ何SFSB的方法,以说明这个方法被调用之后bean的实例将被移除。同P规范l织仍然在讨论是否要有一U机制来处理q种Ҏ的情况,卛_q个Ҏ出现异常的情况下bean的实例是否被U除?

  下面是对以上问题我个人的观点Q?

  1) 是否应该有一个注释来标明一个方法进行初始化呢?我的观点是――应该有Q这样容器就可以在调用其他方法之前至调用一个方法来q行初始化。这不仅可以避免不必要的错误(׃没有调用初始化方?而且可以使容器更明确的判断是否可以重用SFSB实例。我暂且把这个问题放一放,规范l织只考虑Z个方法提供一个注释来声明它是一个初始化Ҏ?

  2) 对于W二个问题我的观点也是肯定的。这有利于Bean的提供者合客户端程序对其进行控制。只有一个遗留的问题Q那是一旦调用这个方法失败,是否能移除这个bean 的实例?{案是不能,但是它将会在回话l束的时候被U除?

  消息驱动Bean

  消息驱动Bean是唯一一U必dC个业务接口的Bean。这个接口指出bean支持的是哪一U消息系l。对于以JMS为基的MDB来说Q这个接口是javax.jms.MessageListener。注意MDB业务接口不是一个真正意义上的业务接口,它只是一个消息接口?

  实体Bean

   实体Bean使用@Entity注释来标讎ͼ所有实体bean中的属?字段不必使用@Transient注释来标记。实体bean的持久化字段可以通过JavaBean-style机制或者声明ؓpublic/protected字段来实现?

   实体bean可以使用助手cL描述其状态,但是q些cȝ实例q没有持久化唯一性(persistent identityQ的Ҏ?卻I唯一标识q个bean的字D늭)Q实际上q些助手cM他们的实体bean实例是紧密结合的Qƈ且这些对象还是以非共享方式来讉K实体对象的?

  实体兌

  EJB3.0同时支持Bean之间双向的合单向的关联,它们可以是一对一、一对多、多对一或者是多对多的兌。然而双向关联的两端q要分ؓ自n端(owning sideQ和Ҏ端(inverse sideQ不同的端。自w端负责向数据库通告兌的变更。对于多对多的关联自w端必须明确的声明。实际上Ҏ端通过isInverse=trueq行注释Q由此自w端׃必说明了而是由另一D|断出Q。看来上面的描述Q规范组l还能说让EJB变的单了吗?

  O/R映射

  EJB3.0中的O/R映射模型也有了重要的改变Q它从原来的abstract-persistence-schema-based变成了现在的Hibernate-inspired模式。尽目前规范组l还在就此进行讨Z是一个明的模型会出现在下一个版本的草案中?

  举例来说QO/R映射模型通过beancM的注释来声明。而且此方法还会指出对应的具体表和字段。O/R映射模型提供了一套自有的SQLQ而且除了提供一些基本的SQL外还支持某些高层开发的功能。比如,有一个通过@Column注释声明的字DcolumnDefinitionQ那么可以写q样的SQLQcolumnDefinition="BLOB NOT NULL"

  客户端程序模?

  一个EJB客户端可以通过@Inject注释以一U?#8220;注入”的方式获得一个bean的业务接口引用。你也可以用另一个注释@javax.ejb.EJBContext.lookup()来完成上面的操作Q但是规范中没有告诉我们一个普通的Java客户端怎样获得一个Bean的实例,因ؓq个普通的Java客户端是q行在一个客L容器中,它无法访问@javax.ejb.EJBContex对象。现在还有另外一U机制来完成上面的工作那是使用一个超U上下文环境对象Q@javax.ejb.Context()。但是规范中没有指出该如何在客户端中使用q个对象?

  EJB QL

  EJB QL可以通过@NamedQuery来注释。这个注释有两个成员属性分别是name和queryString.一旦定义了q些属性,可以通过EntityManager.createNamedQuery(name)来指向这个查询。你也可以创Z个标准的JDBC风格的查询ƈ使用EntityManager.createQuery(ejbqlString)或EntityManager.createNativeQuery(nativeSqlString)(q个Ҏ用于执行一个本地查?来执行查询?

  EJB QL有两个地方可以定义其参数。javax.ejb.Query接口提供了定义参数、指向查询、更新数据等{方法。下面是一个EJBQL指向查询的例子:


  .. ..
  @NamedQuery(
  name="findAllCustomersWithName",
  queryString="SELECT c FROM Customer c WHERE c.name LIKE :custName"
  )
  .. ..
  @Inject public EntityManager em;
  customers = em.createNamedQuery("findAllCustomersWithName")
  .setParameter("custName", "Smith")
  .listResults();


  下面列出了一些EJB QL的增强特性:

  1) 支持扚w更新和删除?

  2) 直接支持内连接和外连接。FETCH JOINq行你指出关联的实体QOrder可以指定只查询某个字Dc?

  3) 查询语句可以q回一个以上的l果倹{实际上Q你可以q回一个依赖的cL如下面这P

  SELECT new CustomerDetails(c.id, c.status, o.count)
  FROM Customer c JOIN c.orders o
  WHERE o.count > 100

  4) 支持group by 和having?

  5) 支持where子句的嵌套子查询?

  在提交的EJB3.0草案中,EJB QL与标准SQL非常的接q。实际上规范中甚至直接支持本地的SQL(像我们上面提到的那?。这一点对某些E序员来说也许有些不是很清楚Q我们将在下面进行更详细的讲解?nbsp;

        多样?

  Ҏ许可(Method permissions)可以通过@MethodPermissions或@Unchecked注释来声明;同样的,事务属性也可以通过@TransactionAttribute注释来声明。规范中仍然保留资源引用和资源环境引用。这些一样可以通过注释来声明,但是有一些细微的差别。比如,上下?context)环境要通过注入工具控制。容器根据bean对外部环境引用自动初始化一个适当的已l声明的实例变量。比如,你可以象下面q样获得一个数据源QDataSourceQ:

  @Resource(name="myDataSource") //Type is inferred from variable
  public DataSource customerDB;

  在上面的例子中如果你不指定引用资源的名称(name)那么其中的customerDB会被认ؓ是默认倹{当所有的引用属性都可得到时Q@Injec注释可以这样写Q?

  @Inject public DataSource customerDB;

  容器负责在运行时初始化customerDB数据源实例。部|h员必d此之前在容器中定义好q些资源属性?

  更好的消息是Q那些以前必L的异常一M复返。你可以声明L的应用程序异常,而不必在再抛出或捕获其他cMCreateException和FinderExceptionq样的异常。容器会抛出装在javax.ejb.EJBException中的pȝU异常或者只在必要时候抛出IllegalArgumentException或IllegalStateException异常?

  EJB文g处理模式

  在我们结束本节之前,让我的快速的览一下容器提供商在EJB处理模式斚w可能的变更。规范中Ҏq没有明的表态,但我可以惛_臛_两种模式?

   一U办法是首先利用EJB文g生成cM于EJB2.1部v模式的文Ӟ包括必要的接口和部v描述W)然后再用cM于EJB2.1的方式来部vq个EJBlg。当Ӟq样产生的部|描q符可能q不标准但是它可以解军_一个容器对EJB2.1和EJB3.0兼容的问题。下面这q图描述了这一q程?

   另一U方法是一U类gJSP托放的部|模式。你可以把一个EJB文g攑ֈ一个预先定义的目录下,然后容器会识别这个EJBq处理它Q然后部|ƈ使之可以使用。这U方法可以徏立于上面那种Ҏ之上Q在支持反复部v时有很大的帮助。考虑到部|的单性也是EJB3.0规范的目的之一Q我真诚的希望在下一个草案出来时能够定一个模?臛_能有一个非正式??

  你有什么想法?

  EJB3.0规范的制定正在有序的q行Qؓ了EJB的开发变得更加容易,EJB规范l织作出的努力是有目q的。就像他们说的那P一切对会变得简单,但做到这一点ƈ不容易。目前已l定义了50个注释标?q有几个在下一个草案中发布)Q每一个都有自q~省规则和其他的操作。当Ӟ我真的不希望EJB3.0变成EJB2.1的一个翻?EJB 3.0 = EJB 2.1 for dummies"Q希望这个等式不要成立)。最后,我还是忍不住要提一些我自己的观点:

  1) 首先Q规范确实反复部v变得Ҏ了,q且有一个简单的模式来访问运行时环境。我q是觉得home接口应该攑ּ?

  2) 在早期的EJB规范中,实体bean用于映射一个持久化存储。理Z(也许只是理论?可能需要把实体bean映射C个遗留的EIS(enterprise information system)pȝ中。出于将来扩展的考虑q样作是有好处的Qƈ且可以更多的业务数据模型采用实体bean。也因此其伴随的复杂性得实体bean不被看好。在本次提交的草案中Q一个实体bean只是一?a target="_blank">数据?/a>的映。ƈ且是Z非抽象持久化模式和简单的数据讉K模式的更加简单开发?

  3) 我对模型变更持保留态度Q我认ؓ在EJB中包含SQL脚本片断q不是个好注意。一些开发h员完全反对包含某?#8220;SQL片段QSQLnessQ?#8221;Q比如@Table ?@Column注释Q。我的观Ҏq些SQLness是好的,据此我们可以清楚的知道我们到底要数据库作些什么。但是某些SQLD|看来q不是很好,比如columnDefinition="BLOB NOT NULL"Q这使得EJB代码和SQL之间的耦合太过紧密了?

  4) 管对于本地SQL的支持看似很׃hQ其实在EJB代码中嵌入SQL是一个非常糟p的L。当Ӟ有些办法可以避免在EJB中硬~码SQLQ但是这应该在规范中说明Q而不能是某些开发h员自己定义的模式?

  5) 假设@Table注释只用于类。在q行旉过@Table注释的name属性定义的表名U将必须对应一个实际的数据库表。规范对此应该给予清楚的说明和一致的模式?

  6) 规范q需要更清楚的说明客L~程模型Q尤其是普通java客户端。规范中所有的参考都假设或者隐含的使用EJB客户端。而且规范中对客户端的向后兼容斚w也没有给出明的说法?

  7) Transient注释应该重新命名以避免和已有的transient关键字发生冲H。事实上Q在q一点上我们更乐于稍微的背离一下configuration-by-exception原则q且定义一个@Persistent注释来明的定义持久化字Dc@Persistent注释可以仅仅是一个标记注释或者它可以有几个属性来兌O/R映射注释?

  与其他规范的兌

  目前可能影响到EJB3.0的JSR有JSR175Qjava语言元数据工P和JSR181Q?a target="_blank">Java Web服务元数据)

  JSR175已经初步完成q且不会和EJB3.0有太大的冲突Q但是JSR181与EJB3.0有两个关联的地方Q?

  1) Web service接口QEJB规范采用一U机刉应JSR181以便可以把一个bean实现Z个Web serviceq告诉Web service如何被客L调用?

  2) JSR 181计划采用不同的机制来处理安全问题。在早期的规范中EJB使用一个一致的机制QMethodPermissionsQ,但是JSR 181计划使用一个稍微不同的方式QSecurityRoles和SecurityIdentity注释Q。同LRunAs注释的定义也存在q些许差别。这一问题q在解决中最l会?a target="_blank">J2EE层的规范中维持其一致性?

  在J2EE 1.5中的一些开发规范可能与EJB3.0有关联。除了上面说到的几个兌之外现在没有其他的开发规范与EJB3.0有冲H?

  l束?/strong>

  在EJB的开发变得简单高效之前,我们q有很长一D\要走。规范组l在降低EJB的开发难度方面v了个好头。O/R映射模型的提议还处在早期阶段Q规范组l正在完善它。我希望它不要太复杂也不要与SQLq分的耦合。让我们不要只是停留在期望、希望、思考和h中:提出你的xq把你的发送给规范l织ejb3-feedback@sun.com。JCPq不是很民主的组l,但是你的一定是有h值的?

  本文的观Ҏ作者的个hd与作者所在的公司没有M关系。作者非常感谢Hemant Khandelwal对发表此文的帮助?

  提供下蝲的代码是EJB3.0草案的示例代码。由于没有工具和环境的支持这个例子是没有l过验证的。这些代码只是示例了未来的EJB3.0大概的样子?

  Anil Sharma是BEA System公司开发Weblogic Integration产品的资q序员。在加入BEA之前曑ְ职于Oracle ?PramatiQƈ一直致力于研究J2EE技术。在业余旉它喜Ƣ听音乐看电影;他还参加一些开源项目的开发工作?br />         

sailor 2008-07-14 13:24 发表评论
]]>
EJB3.0的各应用服务器提供的JNDI接口Q{Q?/title><link>http://www.tkk7.com/sailor/articles/214358.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Fri, 11 Jul 2008 15:27:00 GMT</pubDate><guid>http://www.tkk7.com/sailor/articles/214358.html</guid><wfw:comment>http://www.tkk7.com/sailor/comments/214358.html</wfw:comment><comments>http://www.tkk7.com/sailor/articles/214358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/sailor/comments/commentRss/214358.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sailor/services/trackbacks/214358.html</trackback:ping><description><![CDATA[<a ><font color="#000000">来源Q?/font>http://blog.163.com/e_adon/blog/static/338840452007721831904/</a><br /> <br /> <p>        在分布式开发中QJAVA客户端程序是通过JNDIL询EJB的,而JNDI的全名是QThe Java Naming and Directory Interface。因为JNDI 是一l接口,所以我们只需Ҏ接口规范~程可以。要通过JNDI q行资源讉KQ我们必设|初始化上下文的参数Q主要是讄JNDI 驱动的类?java.naming.factory.initial)和提供命名服务的URL<br /> (java.naming.provider.url)。因为Jndi 的实C品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务?br /> 的不同而不同,java.naming.provider.url 的值包括提供命名服务的L地址和端口号?/p> <p>        大家在编E时Q最令h气愤的就是EJBE序写好了,而客L却不知道如何去调用它Q一般书上只是介l一U应用服务器的访问代码其它的不会提到Q找q方面资料又比较ȝQ当误大家许多时间和_֊Q因此我把已经扑ֈ的代码脓出来Q方便大家查找?/p> <p>        暂且提供以下三种服务器的代码Q今后再慢慢补充吧?/p> <p>        下面是访问Jboss 服务器的<br />         <br />         例子代码Q?br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">Properties props </span><span style="color: #808080">=</span><span style="color: #000000"> new Properties();<br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");<br /> </span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.provider.url", "localhost:</span><span style="font-weight: bold; color: #800000">1099</span><span style="color: #000000">");<br /> </span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />InitialContext </span><span style="color: #808080">=</span><span style="color: #000000"> new InitialContext(props);<br /> </span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />HelloWorld helloworld </span><span style="color: #808080">=</span><span style="color: #000000"> (HelloWorld) ctx.lookup("HelloWorldBean</span><span style="color: #808080">/</span><span style="color: #000000">remote");<br /> </span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <p>        <br />         下面是访问Sun ApplicationServer 及glassfish 应用服务器的例子代码Q?br />         </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">Properties props </span><span style="color: #808080">=</span><span style="color: #000000"> new Properties();<br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.factory.initial",<br /> </span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />"com.sun.enterprise.naming.SerialInitContextFactory");<br /> </span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.provider.url", "localhost:</span><span style="font-weight: bold; color: #800000">3700</span><span style="color: #000000">");<br /> </span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />InitialContext </span><span style="color: #808080">=</span><span style="color: #000000"> new InitialContext(props);<br /> </span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />HelloWorld helloworld </span><span style="color: #808080">=</span><span style="color: #000000"> (HelloWorld) ctx.lookup("com.0735jb.ejb3.HelloWorld");</span></div> <p><br />         下面是访问Weblogic10 应用服务器的例子代码Q?br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">Properties props </span><span style="color: #808080">=</span><span style="color: #000000"> new Properties();<br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");<br /> </span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />props.setProperty("java.naming.provider.url", "t3:</span><span style="color: #808080">//</span><span style="color: #000000">localhost:</span><span style="font-weight: bold; color: #800000">7001</span><span style="color: #000000">");<br /> </span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />InitialContext </span><span style="color: #808080">=</span><span style="color: #000000"> new InitialContext(props);<br /> </span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />HelloWorld helloworld </span><span style="color: #808080">=</span><span style="color: #000000"> (HelloWorld) ctx.lookup("HelloWorldBean<br /> </span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />#com.0735jb.ejb3.HelloWorld");</span></div> <p> </p> <p>        上面是服务器默认的JNDI命名规则,那么如何修改它呢.</p> <p>        在Jboss 中要自定义JNDI 名称Q可以<br />         用@LocalBinding 和@RemoteBinding 注释Q@LocalBinding 注释指定Session Bean 的Local 接口的JNDI 名称Q?br />         @RemoteBinding 注释指定Session Bean 的Remote 接口的JNDI 名称Q下面的代码展示了如何自定义JNDI 名:</p> <p> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #008000">@Stateless</span><span style="color: #000000"><br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">@Remote</span><span style="color: #000000"> ({Operation.class})<br /> </span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">@RemoteBinding</span><span style="color: #000000"> (jndiBinding</span><span style="color: #808080">=</span><span style="color: #000000">"0735jb</span><span style="color: #808080">/</span><span style="color: #000000">RemoteOperation")<br /> </span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">@Local</span><span style="color: #000000"> ({LocalOperation.class})<br /> </span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">@LocalBinding</span><span style="color: #000000"> (jndiBinding</span><span style="color: #808080">=</span><span style="color: #000000">"0735jb</span><span style="color: #808080">/</span><span style="color: #000000">LocalOperation")</span></div> <p> </p> <p>        在JSP 客户端调用上面EJB 的代码片断如下:<br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">InitialContext ctx </span><span style="color: #808080">=</span><span style="color: #000000"> new InitialContext(props);<br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />Operation operation </span><span style="color: #808080">=</span><span style="color: #000000"> (Operation) ctx.lookup("0735jb</span><span style="color: #808080">/</span><span style="color: #000000">RemoteOperation");<br /> </span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />在weblogic10 中,你可以通过</span><span style="color: #008000">@Stateless</span><span style="color: #000000">.mappedName()讄全局JNDI 名称Q如Q?br /> </span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">@Stateless</span><span style="color: #000000">(mappedName</span><span style="color: #808080">=</span><span style="color: #000000">"OperationBeanRemote")<br /> </span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> class OperationBean implements Operation, LocalOperation {<br /> </span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <p><br />         客户端调用EJB 的代码片断如下:<br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">InitialContext ctx </span><span style="color: #808080">=</span><span style="color: #000000"> new InitialContext(props);<br /> </span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />Operation operation </span><span style="color: #808080">=</span><span style="color: #000000"> (Operation) ctx.lookup("OperationBeanRemote#com.0735jb.ejb3.Operation");</span></div> <img src ="http://www.tkk7.com/sailor/aggbug/214358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sailor/" target="_blank">sailor</a> 2008-07-11 23:27 <a href="http://www.tkk7.com/sailor/articles/214358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3 Persistence API标准化持久??http://www.tkk7.com/sailor/articles/214187.htmlsailorsailorFri, 11 Jul 2008 02:26:00 GMThttp://www.tkk7.com/sailor/articles/214187.htmlhttp://www.tkk7.com/sailor/comments/214187.htmlhttp://www.tkk7.com/sailor/articles/214187.html#Feedback0http://www.tkk7.com/sailor/comments/commentRss/214187.htmlhttp://www.tkk7.com/sailor/services/trackbacks/214187.html
  虽然存在多种构徏应用E序持久层的选择Q但是还没有一U面向Javaq_的、在Java EE和Java SE环境下均可用的持久性标准。好消息是EJB3 Java Persistence API (JPA)Q它是EJB 3.0规范JSR-220的一部分Q的出现Q它标准化了面向Javaq_的持久性API。JSR-220为O-R映射供应商(例如TopLink、Hibernate和KodoQ以及其他领先的应用服务器供应商和JDO供应商所q泛接受。EJB3规范提供了一U极有吸引力的选择Q用于构Z业Java应用E序的持久层?br />
  在本文中Q我介lEJB3 Java Persistence APIQ我用一个简单的域对象模型作为示例?

  域模?/strong>

  在构Z业应用程序时Q我们首先会设计希望其保存在数据库中的域对象模型;然后Q与数据库设计h员合作,定数据库模式。域模型表示了持久性对象或实体。实体可以是人、地Ҏ事物Q您存储关于它们的数据。它包含数据和行为。富域模型具有所有面向对象的行ؓ特征Q例如承性和多态性?br />
  我们的简单域模型Q图1Q具有Department与Employee实体之间的双向一对多关系。FullTime和Contractor实体l承自Employee实体?br />
?.CZ域对象模?
?.CZ域对象模?

  O-R框架和EJB3 JPA基础知识

  如果使用qO-R映射框架Q例如Oracle TopLinkQ构建应用程序持久层Q您׃注意刎ͼ每种框架都提供三U工P

  一U声明式地执行O-R映射的方式。这U方法(UCؓO-R映射元数据)允许对象映到一个或多个数据库表。通常Q大多数O-R框架使用XML存储O-R映射元数据?

  一个用于操作实体(例如Q执行CRUD操作Q的API。此API允许持久化、检索、更新或U除对象。基于API和O-R映射元数据的使用QO-R框架代表开发h员执行数据库操作。此API开发h员从~写JDBC或SQL代码以持久化域对象的工作中解攑և来?

  一U用于检索对象的查询语言。这是持久性最重要的方面,因ؓ非法的SQL语句可能会降低数据库的速度。此Ҏ也对应用E序屏蔽了؜乱地遍布应用E序的的专有SQL。查询语a允许索实体或对象Qƈ开发h员从~写SQL SELECT语句的工作中解放出来?

  EJB3 Java Persistence API (JPA)提供一U标准O-R映射机制、一个执行CRUD操作的EntityManager API以及一U扩展EJB-QL以检索实体的方式Q从而标准化了面向Javaq_的持久性的使用。我在后面讨论q三个方面?

  启用元数据注?/strong>

  Java SE 5.0引入了元数据注释。Java EE的所有组Ӟ包括EJB3 JPAQ大量用元数据注释以简化企业Java开发。要了解关于元数据注释的更多信息Q请参阅Kyle Downey所著的Bridging the Gap: J2SE 5.0 Annotations。在EJB3 JPA中,注释可以用于定义对象、关pRO-R映射和持久性上下文的注入。JPAq提供用XML描述W来代替的选择。我主要介l元数据注释的用,因ؓ它们大大化了开发。不q,您可能更們֐于在生部v环境中用XML
        
        标准化JPA中的O-R映射


  定义持久对象Q实?br />
  实体是轻量的域对象——您希望其保存在关pL据库中的Plain Old Java Object (POJO)。像MPOJO一P实体可以是抽象或具体c,它能够扩展另一个POJO。可以用javax.persistence.Entity注释POJO标记为实体?br />
  以下代码域模型中的Department对象成ؓ实体Q?

package onjava;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
@Entity
@NamedQuery(name="findAllDepartment", query="select o from Department o")
@Table(name="DEPT")
public class Department implements Serializable {
@Id
@Column(nullable=false)
protected Long deptNo;
@Column(name="DNAME")
protected String name;
@Column(name="LOC")
protected String location;
@OneToMany(mappedBy="department")
protected Collection employees;
public Department() {
}
...
public Collection getEmployees() {
return employees;
}
public void setEmployees(Collection employees) {
this.employees = employees;
}
public Employee addEmployee(Employee employee) {
getEmployees().add(employee);
employee.setDepartment(this);
return employee;
}
public Employee removeEmployee(Employee employee) {
getEmployees().remove(employee);
employee.setDepartment(null);
return employee;
}
}

  每个实体都有一个主键;可以在持久字D|属性上使用Id注释其标记Z键。实体通过使用字段或属性(通过setter和getterҎQ来保存其状态。这取决于在哪里使用O-R映射注释。以上示例用基于字D늚讉KQ我们已l用了hdeptNo字段的Id注释。要使用Z属性的讉KQ就要用属性标记注释(例如IdQ,如下所C:

@Id
public Long getDeptNo() {
return deptNo;
}
public void setDeptNo(Long deptNo) {
this.deptNo = deptNo;
}

  误住,对一个实体层ơ结构中的所有实体,必须应用相同的访问类型(字段或属性)?br />
  默认情况下,定义在实体中的每个字D天然就是持久的Q如果不希望保存字段/属性的状态,则必d字段/属性定义ؓ瞬态的Q方法是使用@Transient注释或transient修饰W标记它?

  可嵌入对?/strong>

  可嵌入对象是不具有自己标识的持久对象Q它是另一个实体的一部分。例如,我们可以假定Address没有自己的标识,且作为Employee实体的一部分存储。因此,Address是可嵌入对象的候选?br />
  可以如下所C创建可嵌入对象Q?

@Embeddable
public class Address {
protected String streetAddr1;
protected String streetAddr2;
protected String city;
protected String state;
..
}

  以下是将对象定义为目标实体中的可嵌入对象的方法:

@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
protected Long id;
...
@Embedded
protected Address address;
...
}

描述W,因ؓ可以使用它们重写注释?br />
            关系

  在一个典型的域模型中Q实体是彼此兌的,或者它们相互之间存在着关系。两个实体之间的关系可以是一对一、一对多、多对一和多对多的。这些关pd以分别用OneToOne、OneToMany、ManyToOne或ManyToMany注释表示。在我们的示例中QDepartment和Employee实体之间h双向OneToMany关系?br />
  既然我们在实体中使用了基于字D늚讉KQ我们就在Department实体的关pdD上指定注释Q如下所C:

@OneToMany(mappedBy="department")
protected CollectionQEmployeeQ?employees ;

  对于双向关系Q必d关系的另一Ҏ定mappedBy元素Q如上)Q方法是指向拥有此关pȝ字段或属性的名称?

  标准化O-R映射

  可以使用Java元数据注释或XML实现实体的O-R映射。EJB3 JPA定义了多U用于O-R映射的注释,例如Table、SecondaryTable、Column、JoinColumn和PrimaryKeyJoinColumn。请参阅EJB3 JPA规范Q以获得关于所有注释的信息?br />
  在我们的CZ中,可以使用Table注释定义实体被映到的表Q如下所C:

@Table(name="DEPT")
public class Department implements Serializable {

  EJB3 JPA严重依赖于默认设|,因此如果未定义表映射Q则持久性提供程序会假定此实体被映射C实体cd名的表(在我们的CZ中是DEPARTMENTQ。如果实体被映射到多个表Q则可以使用SecondaryTable注释?br />
  可以使用Column注释持久字D|属性映到数据库列Q如下所C:

@Column(name="DNAME")
protected String name;

  q里QDNAME是持久字D名U所映射到的列的名称。如果未使用Column注释定义O-R映射Q则持久性引擎会试其状态保存在列中Q用与字段或属性相同的名称Q?

  实体l承?/strong>

  EJB3 JPA支持多种实体l承性方法。它需要两U类型的l承性表映射{略QSingle-table-per-entity层次l构{略和Joined-Subclass{略。最好避免用可选的table-per-class层次l构?br />
  Single-table-per-entity (SINGLE_TABLE)层次l构{略允许层ơ结构中的所有实体映到一个表。在我们的示例中QFullTime和Contractor扩展了EmployeeQ所有这些都可以映射C个名为EMP的表。换句话_所有与Employee、FullTime和Contractor有关的数据都被存储于相同的表内?br />
  如果使用Joined Subclass{略Q则可以公共持久数据存储在类所映射到的表中Q例如EmployeeQ,q且可以为层ơ结构中每个子类创徏表,以便存储特定于子cȝ持久字段?br />
  必须在超cM使用Inheritance注释Q以指定l承cdQ如以下代码所C。此CZ展示了用single-table-per-entity层次l构{略的实体层ơ结构?

@Entity
@Table(name="EMP")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="EMPLOYEE_TYPE",
discriminatorType=DiscriminatorType.STRING, length=1)
public abstract class Employee implements Serializable {
...
}

  每个子类必须指定用于该实体类型的鉴别器|如下所C:

@Entity
@DiscriminatorValue(value="F")
public class FullTime extends Employee {
@Column(name="SAL")
protected Double salary;
@Column(name="COMM")
protected Double commission;
@Column(name="DESIG")
protected String designation;
...
}

  Entity Manager APIQ用于实体操作的标准API

  javax.persistence.EntityManager理实体生命周期Qƈ公开了多个在实体上执行CRUD操作的方法?br />
  EntityManager API在事务上下文中调用。可以在EJB容器外部Q例如,从一个Web应用E序Q调用它Q而无需会话bean外观?br />
  在执行Q何实体操作之前,必须获取EntityManager实例。可以用容器管理或应用E序理的实体管理器Q可以用JNDI查找或依赖注入来获取EntityManager实例。正如其名称所暗示的,Java EE容器理着容器理实体理器的生命周期。它可能主要在企业Java应用E序中用?br />
  可以使用PersistenceContext注入获取容器理实体理器实例,如下所C:

@PersistenceContext(unitName="onjava")
private EntityManager em;

  如果使用应用E序理的实体管理器Q则必须理其生命周期。可以创Z个应用程序管理实体管理器实例Q如下所C:

@PersistenceUnit(unitName="onjava")
private EntityManagerFactory emf;
private EntityManager em = emf.createEntityManager();

  然后可以使用EntityManager实例在实体上执行CRUD操作。要关闭应用E序理实体理器实例,请在完成工作后调用em.close()Ҏ?br />
  如前所qͼ必须在事务上下文中执行涉及Q何数据库更改的实体管理器操作?br />
  下表列出了EntityManager接口的一些用于执行实体操作的关键Ҏ?

Ҏ 用?/td>
public void persist(Object entity); 持久化实体实例?/td>
public QTQ?T merge(T entity); 合ƈ分离的实体实例?/td>
public void remove(Object entity); U除实体实例?/td>
public QTQ?T find(ClassQTQ?entityClass, Object primaryKey); 通过主键索实体实例?/td>
public void flush(); 使实体状态与数据库同步?

  可以使用persist()Ҏ持久化实体实例。例如,如果x久化Contractor实例Q请使用以下代码Q?

@PersistenceContext(unitName="onjava")
private EntityManager em;
...
Contractor pte = new Contractor();
pte.setName("Nistha")
pte.setHourlyRate(new Double(100.0));
em.persist(pte);

  在持久化实体Ӟ如果此关pȝCascadeType被设|ؓPERSIST或ALLQ则M对关联实体的状态更改也被持久化。除非正在用扩展的持久上下文,否则实体在事务l止后分R合q操作允许将分离的实体实例与持久上下文合qӞ分离实体的状态将与数据库同步。这有助于摆脱EJB 2.x中常见的数据传输对象(Data Transfer ObjectQDTO)反模式,因ؓ作ؓPOJO的实体可以在层与层之间传输。惟一的要求是实体cdd现java.io.Serializable接口?nbsp;

        查询API

  对实体的索是持久性的一个重要方面。用EJB3 JPAӞ使用Java持久化查询语a(Java Persistence Query LanguageQJPQL)表示查询。JPQL是EJBQL的扩展,它是作ؓEJB 2.0规范的一部分而引入的。然而,EJB3 JPA解决了EJBQL的所有局限性,q添加了许多新特性,从而成ZU功能强大的查询语言?

  JPQL较之EJBQL 2.x的改q?/strong>

  以下是EJB3 JPA中的JPQL的新Ҏ:

  ·化了的查询语?

  ·JOIN操作

  ·Group By和Having Clause

  ·子查?

  ·动态查?

  ·指定参数(named parameter)

  ·扚w更新和删?

  此外Q如果希望从特定于数据库的查询扩展中LQ则必须Ҏ询实体用原?native ) SQL?

  动态查询与指定查询

  可以使用动态查询或指定查询(named query)。指定查询随实体存储Q可从应用程序重用?br />
  要创建动态查询,请用实体管理器接口的createQueryҎQ如下所C:

Query query = em.createQuery(
"select e from Employee e where e.empNo Q?1");
query.setParameter(1,100);
return query.getResultList();

  如果希望此查询用作指定查询Q请在实体中使用NamedQuery注释Q如下所C:

@Entity
@NamedQuery(name="findAllEmployee",
query="select e from Employee e where e.empNo Q?1")
public abstract class Employee implements Serializable {
}

  要执行指定查询,首先使用EntityManager接口上的createNamedQueryҎ创徏一个Query实例Q如下所C:

query = em.createNamedQuery(" findAllEmployee");
query.setParameter(1,100);
return query.getResultList();

  指定参数

  可以在EJBQL查询中用指定参?named parameter)代替位置参数(positional parameter)。例如,可以以上查询重写如下:

  "select e from Employee e where e.empNo Q?:empNo "

  如果在查询中使用指定参数Q则必须讄此参数如下:

query = em.createNamedQuery("findAllEmployee");
query.setParameter("empNo",100);
return query.getResultList();

  打包

  EJB3 JPA标准化了POJO持久性。因此,实体q不局限于EJB模块Q它们能够打包到Web模块、ejb-jar模块、EARU中的库模块或标准jar文g中。也可以在Java SE中用实体。必d包含实体的档案文件中打包描述W?persistence.xml)Q如下所C:

QpersistenceQ?
Qpersistence-unit name="onjava"Q?
QproviderQoracle.toplink.essentials.PersistenceProviderQ?providerQ?br /> Qjta-data-sourceQjdbc/OracleDSQ?jta-data-sourceQ?
...
Q?persistence-unitQ?
Q?persistenceQ?/td>

  此描q符标识持久性提供程序、持久单元和持久单元所使用的数据源。正如其名称所暗示的,持久单元是集中管理的实体的集合。如果有一个定义在特定模块中的持久单元Q就不需要在persistence.xml中标识实体类Q它由持久性提供程序动态发现?

  参考实?/strong>

  BEA Kodo以及Oracle TopLink的TopLink Essentials都提供了EJB3 JPA的参考实现。它可分别从Open JPA和GlassFish开源项目中得到?br />
  您可以在参考实现服务器或其他Q何服从EJB3 JPA的应用服务器上用本文中的代码?

  EJB3 JPA工具

  开发工L实能够帮助构建更好的应用E序Q而如果用XML实现O-R映射Q情况可能就不太妙了?a class="bluekey" target="_blank">Eclipse Dali O-R映射目QOracle JDeveloper 10.1.3和BEA Workshop studio之类的工具都支持EJB3 JPA?

  l束?/strong>

  EJB3 Java Persistence API标准化了面向Javaq_的持久性API。它通过使用元数据注释和异常配置ҎQ简化了透明持久性的使用。多U应用服务器已支持EJB3规范Q编者注QBEA已经发布WebLogic Server EJB 3.0 Tech Preview Q。随着Java EE 5.0和EJB 3.0规范的完成,您将很快看到许多一的应用服务器和持久性提供程序会实现EJB3 Java Persistence API。您可以使用来自GlassFish目?参考实?来启用EJB3 Persistence?br />
        原文Qhttp://dev.yesky.com/396/2498396.shtml

sailor 2008-07-11 10:26 发表评论
]]>
վ֩ģ壺 뾫Ʒһѿ| ߹ۿ| 鴤һһgifƵ| ޹Ʒ13p| ŮƵaƵȫվɫ| һƬѲ| ޾Ʒŷ߹ۿ| ѹۿСˮ| ũѸһëƬѿƵ| avպƬ߹ۿ| һˮëƬѿ| ˺ݺۺϾþ88| 99þѿƷ| ޶Ƶ| ³˿Ƭһ߹ۿ| Ƶһ߹ۿ| ߾ƷһС˵| ձѾþþþþþվ| ޾ƷŮ߹ۿ| ŷÿѵӰ߹ۿ| AVһδ| ˳վ߲| Ļѹۿ| ޾Ʒ| ѿaɫƬ| õɫƵȫ| ޾ƷƵۿ| ѿƸվƵ| ѿƬ| ˳www| ѿaɫƬ| ƬվɫƬѹۿAPP| ŮɫŷŮ| ձػaѴƬ| ĻëƬѿ| ޹˾ƷӰ| ˺ݺۺϾþ޸| Ʒþ8xѹۿ| Ļϵ| ۺϼ| ߹ۿվ|