我有一些有关与冬眠的互动的疑问:

  1. 我是否使用Opensession或GetCurrentsessess(没有JTA,线程)?
  2. 如何将会话操作与Swing GUI混合?好的在Javabean课程中有以下代码之类的东西吗?

    public void actionPerformed(ActionEvent event) {
        // session code
    }
    
  3. 我可以将方法添加到包含HQL查询的实体还是不良习惯?例如:

     // This method is in an entity MyOtherEntity.java class
     public int getDuration(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        int sum = (Integer) session.createQuery("select sum(e.duration) as duration from MyEntity as e where e.myOtherEntity.id=:id group by e.name").
            .setLong("id", getId());
            .uniqueResult();
        return sum;
     }
    

我该如何以更好,优雅的方式进行操作?

更新一种广泛使用的实践是建立服务/DAO类以实现我们实体类的CRUD操作。但是为什么这很好?为什么我必须为每个实体写一堂课才能管理它?真正的优势在哪里?

更新2服务课是DAO模式吗?这是什么意思?亚瑟·罗纳德(Arthur Ronald)FD加西亚(Garcia)的存储库 是DAO模式吗?这是所谓的“服务层”?

有帮助吗?

解决方案

如果你想 依靠普通的冬眠API 您可以使用服务层,因为

  • 用例驱动
  • 划界交易边界

因此,您可以创建一个帐户服务,例如

public static path.to.HibernateUtil.getSessionFactory;

public class AccountService {

    public void withdraw(Integer accountNumber, BigDecimal amount) throws Exception {
        /**
          * Here you set up Transaction boundaries
          */
        getSessionFactory().getCurrentSession().beginTransaction();

        // Some actions goes here

        getSessionFactory().getCurrentSession().getTransaction().commit();
    }

}

通常,在服务层内执行某些操作时,您通常需要一个存储库。您可以想到存储库 作为数据提供商和存储. 这里 您可以看到我如何实现我的存储库。

如果你想 可维护且可读的HQL查询, ,我建议您在多线和外部化XML文件中外部化HQL查询

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <query name="GIFT_CARDS_WITH_BUYER">
        <![CDATA[
            from 
                GiftCard c
            left join fetch 
                c.buyer
            where
                c.recipientNotificationRequested = 1
       ]]>
    </query>
    <query name="GIFT_CARDS_WITHOUT_NO_RELATIONSHIP">
        <![CDATA[
            from 
                GiftCard
        ]]>
    </query>
</hibernate-mapping>

因此,在您的Swing GUI活动中,您可以像

public void actionPerformed(ActionEvent event) {
    // Some related Swing GUI actions goes here (retrieve User input, validate data and so on...)

    accountService.withdraw(accountNumber, new BigDecimal(amount));
}

在实体内使用持久性动作并不是一个好主意。如果您需要在实体内部执行与持久性有关的问题,我认为最好将存储库作为参数传递给实体

public class Account {

   public void doSomething(AccountRepository repository) {
       // code goes here
   }

}

也许你想看 线

我建议您使用Hibernate Book,第9章(使用对象)来看看Java的持久性。 att: : 仔细读

更新

为什么好的服务层?

首先

  • 它是用例驱动的(它绘制了您的应用程序应该做什么)

第二

  • 它界定交易边界

假设这里是您的服务层

public class MyService {

    public void doSomething() {
        getSessionFactory().beginTransaction();

        // A POJO doing some operation

        // Other POJO doing other operation

        // Another POJO doing another operation

        getSessionFactory().getTransaction().commit();
    }

}

请注意,您只是定义一个交易边界,而不是定义每个POJO内部的每个交易边界。更重要的是,是否需要在其他组件内使用Swing GUI内部的业务规则。您会使用ctrl-c + ctrl-v吗???

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top