我如何混合冬眠和摇摆
-
28-09-2019 - |
题
我有一些有关与冬眠的互动的疑问:
- 我是否使用Opensession或GetCurrentsessess(没有JTA,线程)?
如何将会话操作与Swing GUI混合?好的在Javabean课程中有以下代码之类的东西吗?
public void actionPerformed(ActionEvent event) { // session code }
我可以将方法添加到包含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吗???
不隶属于 StackOverflow