⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用hibernate和spring开发事务持久层.htm

📁 在java中使用Hibernate和Spring开发事务持久层
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                        user from User user where user.group is null"<BR>&nbsp;* 
                        <BR>&nbsp;* @hibernate.query 
                        name="UsersBySalaryGreaterThan" <BR>&nbsp;* query="from 
                        User user inner join user.contactInfo info where 
                        info.salary &gt; ?1"<BR>&nbsp;* <BR>&nbsp;* 
                        @hibernate.query name="UsersBySalaryBetween" <BR>&nbsp;* 
                        query="from User user join user.contactInfo info where 
                        info.salary between ?1 AND ?2"<BR>&nbsp;* <BR>&nbsp;* 
                        @hibernate.query name="UsersByLastNameLike" <BR>&nbsp;* 
                        query="from User user join user.contactInfo info where 
                        info.lastName like ?1"<BR>&nbsp;* <BR>&nbsp;* 
                        @hibernate.query name="GetEmailsOfUsers" <BR>&nbsp;* 
                        query="select user.email from Group g join g.users as 
                        user where g.name = ?1"<BR>&nbsp;* 
                        <BR>&nbsp;*/<BR>public class User 
                        {<BR>&nbsp;&nbsp;&nbsp;.<BR>&nbsp;&nbsp;&nbsp;.<BR>&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;</P>
                        <P>  上述代码定义了几个预定义查询。预定义查询 是存储在 *.hbm.xml 文件中的查询。在清单 5 
                        中,可以看到如何执行预定义查询。</P>
                        <P>  清单 5. 使用预定义查询<BR>  [UserDAO.java]</P>
                        <P style="BACKGROUND: #eeeeee">&nbsp;/**<BR>&nbsp; * 
                        Demonstrates a query that returns a String.<BR>&nbsp; 
                        */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        <BR>&nbsp;public String[] getUserEmailsInGroup(String 
                        groupName){<BR>&nbsp;&nbsp;List emailList 
                        =<BR>&nbsp;&nbsp;getHibernateTemplate().findByNamedQuery("GetEmailsOfUsers"); 
                        <BR>&nbsp;&nbsp;return (String 
                        [])<BR>&nbsp;&nbsp;&nbsp;emailList.toArray(new 
                        String[emailList.size()]);<BR>&nbsp;}<BR><BR>&nbsp;/**<BR>&nbsp; 
                        * Demonstrates a query that returns a list of 
                        Users<BR>&nbsp; *<BR>&nbsp; * @return A list of emails 
                        of all of the users in the authentication 
                        system.<BR>&nbsp; * <BR>&nbsp; 
                        */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        <BR>&nbsp;public List getUsers(){<BR>&nbsp;&nbsp;return 
                        getHibernateTemplate().findByNamedQuery("AllUsers");<BR>&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        /**<BR>&nbsp;* Demonstrates passing a single argument to 
                        a query. <BR>&nbsp;*<BR>&nbsp;* @return A list of 
                        UserValue objects.<BR>&nbsp;* 
                        <BR>&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        <BR>&nbsp;public List getUsersBySalary(float 
                        salary){<BR>&nbsp;&nbsp;&nbsp; return 
                        getHibernateTemplate()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        .findByNamedQuery("UsersBySalaryGreaterThan",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        new 
                        Float(salary));<BR>&nbsp;}<BR><BR>&nbsp;/**<BR>&nbsp; * 
                        Demonstrates passing multiple arguments to a 
                        query<BR>&nbsp; * <BR>&nbsp; * @return A list of 
                        UserValue objects.<BR>&nbsp; * <BR>&nbsp; 
                        */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        <BR>&nbsp;public List getUsersBySalaryRange(float start, 
                        float 
                        stop){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        return getHibernateTemplate()<BR>&nbsp;&nbsp; 
                        .findByNamedQuery("UsersBySalaryBetween",<BR>&nbsp;&nbsp;&nbsp;new 
                        Object[] {new Float(start), new 
                        Float(stop)});<BR>&nbsp;}</P>
                        <P>  查询进行时,可以在持久层中加上最后一层:使用 Spring 的事务管理。</P>
                        <P>  <STRONG>用 Spring 管理事务</STRONG></P>
                        <P>  Spring 可以声明式地管理事务。例如,UserDAO.addUser 
                        方法当前不是在单个事务中执行的。因此,组中的每一个用户都插入到自己的事务中,如清单 6 所示。</P>
                        <P>  清单 6. 添加一组用户<BR>  [UserDAO.java]</P>
                        <P style="BACKGROUND: #eeeeee">/**<BR>&nbsp;* @param 
                        group<BR>&nbsp;*/<BR>public void addGroup(Group group) 
                        {<BR>&nbsp;getHibernateTemplate().save(group);<BR>&nbsp;<BR>}</P>
                        <P>[UserDAOTest.java]</P>
                        <P style="BACKGROUND: #eeeeee">public void 
                        testAddGroupOfUsers(){<BR>&nbsp;Group group = new 
                        Group();<BR>&nbsp;<BR>&nbsp;for (int index=0; index &lt; 
                        10; index++){<BR>&nbsp;&nbsp;User user = new 
                        User();<BR>&nbsp;&nbsp;user.setEmail("rick"+index+"@foobar.com" 
                        );<BR>&nbsp;&nbsp;user.setPassword("foobar");<BR>&nbsp;&nbsp;group.addUser(user);&nbsp;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;group.setName("testGroup");<BR>&nbsp;<BR>&nbsp;userDAO.addGroup(group);<BR>&nbsp;assertNotNull(group.getId());<BR>&nbsp;<BR>&nbsp;Group 
                        group2 = 
                        userDAO.findPopulatedGroupByName("testGroup");<BR>&nbsp;<BR>&nbsp;assertEquals("testGroup",group2.getName());<BR>&nbsp;assertEquals(10, 
                        group2.getUsers().size());<BR>&nbsp;String email = 
                        ((User)group2.getUsers().get(0)).getEmail();<BR>&nbsp;assertEquals("rick0@foobar.com", 
                        email);<BR><BR>}</P>
                        <P>  不建议使用上述解决方案,因为每一个 User 
                        都要在自己的事务中插入到数据库中。如果出现问题,那么只能添加部分用户。如果希望保留 ACID 
                        属性(即保证所有都发生或者所有都不发生),可以通过程序进行事务管理,但是它很快就会变得一团糟了。相反,应使用 
                        Spring 的 AOP 来支持声明式的事务,如清单 7 所示。</P>
                        <P>  清单 7. 声明式管理事务<BR>  [applicationContext.xml]</P>
                        <P style="BACKGROUND: #eeeeee">&lt;!-- Pass the session 
                        factory to our UserDAO --&gt;<BR>&nbsp;&nbsp; &lt;bean 
                        id="userDAOTarget" 
                        class="net.sf.hibernateExamples.UserDAOImpl"&gt;<BR>&nbsp;&lt;property 
                        name="sessionFactory"&gt;&lt;ref 
                        local="sessionFactory"/&gt;&lt;/property&gt;<BR>&nbsp;&nbsp; 
                        &lt;/bean&gt;<BR>&nbsp;<BR>&nbsp;&nbsp; &lt;bean 
                        id="transactionManager" <BR>&nbsp;&nbsp; 
                        &nbsp;class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        &lt;property name="sessionFactory"&gt;&lt;ref 
                        bean="sessionFactory"/&gt;&lt;/property&gt;<BR>&nbsp;&nbsp; 
                        &lt;/bean&gt;<BR><BR>&lt;bean 
                        id="userDAO"<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
                        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<BR>&nbsp;&lt;property 
                        name="transactionManager"&gt;&lt;ref 
                        local="transactionManager"/&gt;&lt;/property&gt;<BR>&nbsp;&lt;property 
                        name="target"&gt;&lt;ref 
                        local="userDAOTarget"/&gt;&lt;/property&gt;<BR>&nbsp;&lt;property 
                        name="transactionAttributes"&gt;<BR>&nbsp;&nbsp;&lt;props&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;prop 
                        key="addGroup"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<BR>&nbsp;&nbsp;&lt;/props&gt;<BR>&nbsp;&lt;/property&gt;<BR>&lt;/bean&gt;</P>
                        <P>  注意在准备清单 7 的代码时,我重新改写了 UserDAO 并提取了其接口。这个接口现在是 
                        UserDAO,它的实现类是 UserDAOImpl。这样清单 7 中的事务代码就使用了带有事务属性 
                        (PROPAGATION_REQUIRED) 的 UserDAO.addGroup() 
                        方法。现在只要底层数据库支持,就可以在一个事务中添加所有用户。</P>
                        <P>  <STRONG>结束语</STRONG></P>
                        <P>  在本文中,介绍了如何使用 Hibernate 和 Spring 实现一个事务持久层。Hibernate 
                        是一种先进的 OR 映射工具,而 Spring 是一个 AOP 框架和 IOC 
                        容器。这两种技术的综合使用,使得开发人员可以编写媲美数据库厂商的代码,它可以在 J2EE 
                        容器中运行,也可以单独运行。使用了 DbUnit (JUnit 
                        的扩展)构建和测试本文中例子的所有代码,虽然这不是讨论的重点。</P></TD></TR></TBODY></TABLE></TD></TR>
              <TR>
                <TD width=10 height=11><IMG height=11 
                  src="用Hibernate和Spring开发事务持久层.files/u_16.gif" width=10></TD>
                <TD style="BORDER-BOTTOM: #e8e8e8 1px solid" width=695 
                bgColor=#f9f9f9 height=11><IMG height=1 src="" width=1></TD>
                <TD width=10 height=11><IMG height=11 
                  src="用Hibernate和Spring开发事务持久层.files/u_17.gif" 
              width=10></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
      <DIV align=right>页面功能&nbsp; 【<A 
      href="javascript:window.external.AddFavorite(location.href,document.title+'--www.JavaFan.NET');">加入收藏</A>】 
      【<A 
      onclick="window.open(this.href,'','top=180,left=240,width=342,height=326,scrollbars=yes,resizable=no');return false;" 
      href="http://www.javafan.net/sendarticle.jsp?title=用Hibernate和Spring开发事务持久层&amp;URL=20041223180912482">推荐给朋友</A>】 
      【字体:<A class=black href="javascript:fontZoom(15)">大</A>&nbsp;<A 
      class=black href="javascript:fontZoom(13)">中</A>&nbsp;<A class=black 
      href="javascript:fontZoom(12)">小</A>】 【<A class=black 
      href="javascript:window.close()">关闭</A>】&nbsp;&nbsp;&nbsp; </DIV></TD></TR>
  <TR>
    <TD vAlign=top><IMG height=12 
      src="用Hibernate和Spring开发事务持久层.files/u_06.gif" 
width=751></TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
  <TBODY>
  <TR>
    <TD bgColor=#cacaca height=1></TD></TR>
  <TR>
    <TD vAlign=center align=middle height=30>Copyright &copy; 2003 - 2005 
      JavaFan.NET All Rights Reserved</TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -