gpt4 book ai didi

java - 我怎样才能很好地混合使用 Hibernate 和 Swing

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:07 25 4
gpt4 key购买 nike

我有一些关于与 Hibernate 交互的问题:

  1. 我是使用 openSession 还是 getCurrentSession(不使用 jta,而是使用线程)?
  2. 如何将 session 操作与 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;
    }

我怎样才能以更好、更优雅的方式做到这一点?

更新一个广泛使用的做法是做一个service/dao类来实现我们实体类的CRUD操作。但是为什么这样好呢?为什么我必须为我的每个实体编写一个类来管理它?真正的优势在哪里?

更新 2服务类是DAO模式?这是什么意思? Arthur Ronald F D Garcia's repository example是DAO模式,这就是所谓的“服务层”吗?

最佳答案

如果您想依赖普通的 Hibernate API,您可以使用服务层,因为

  • 它是用例驱动的
  • 划定事务边界

因此您可以创建一个 AccountService,例如

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();
}

}

在服务层内执行某些操作时,您通常需要一个存储库。您可以将存储库视为数据提供者和存储Here你可以看到我是如何实现我的存储库的。

如果您想要可维护和可读的 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
}

}

也许你想看this线程

我建议您看一下 Java Persistence with Hibernate 一书,第 9 章(使用对象)。 ATT:仔细阅读

更新

Why is good have a service layer ?

首先

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

第二个

  • 它划定交易边界

假设这里是你的服务层

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 吗???

关于java - 我怎样才能很好地混合使用 Hibernate 和 Swing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com