Hibernate中

时间:2015-07-31 10:17:52

标签: java hibernate anonymous-class

我目前正在开发一个使用Struts和Hibernate构建的项目。

项目中的所有DAO类都具有以下代码

内部构造函数:

hibernateSession = HibernateUtil.currentSession();      
tx=hibernateSession.beginTransaction();

所有方法的最终子句内容:<​​/ strong>

HibernateUtil.closeSession();

这实际上意味着,在我的业务代码中,每次我想要从数据库访问数据时,我都必须初始化引用变量或创建一个匿名对象,即

如果我必须访问method1的{​​{1}}和method2

class A

现在我的问题是:

  1. 使用后是否收集了匿名对象垃圾?在我的项目中,由于每次访问DAO类中的方法都是通过匿名对象进行的,它是否会对内存占用产生负面影响?如果是的话有其他选择吗?

  2. 我是正确地做了还是有更好的方法?

  3. 这是使用Hibernate实现的最佳/正确方法吗?

  4. A a= new A(); a.method1(); // access method 1 a = new A(); a.method2(); //access method 2 I now mostly use anonymous objects to get this done ie new A().method1(); //access method 1 new A().method2(); //access method 2 使用“匿名对象”一词是否正确?在Google中搜索同样的内容时,我注意到很多评论说这不是Java中的匿名对象,但也有一些文章将其解释为匿名对象。

2 个答案:

答案 0 :(得分:3)

  1. 没有匿名对象这样的东西。您可以拥有匿名类实例,但在您的情况下,我认为您的意思是“局部变量”。 GC使用针对短期对象的高度优化的收集策略,因此即使在商品硬件上也不会出现内存问题。

  2. 有更好的方法。使用Spring transaction management support,您可以从应用程序代码中删除事务处理例程,因此您的业务逻辑只能关注与业务相关的功能。

  3. Transient entities and detached objects是常见做法,所以不用担心。

  4. 这个词不正确。局部变量或瞬态对象是一个更具描述性的术语。

答案 1 :(得分:3)

1)是的,他们有资格进行垃圾收集。在现代JVM中,这不会对垃圾收集器性能产生任何重大影响,因为这些对象将直接从Eden空间清除。

2)有一种更好的方式 - 依赖注入(DI,IoC),例如Spring DI

3)不,这不是实现它的最好方法,因为除了有很多容易出错的样板代码之外,你还会为每个DAO方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同的DAO组合多个方法调用。更好的选择是使用为此目的设计的框架在服务层声明性地划分事务。一个例子是Spring transaction management

4)在Java中没有官方用语(老实说,对我而言,将其命名为有意义)。在java世界中,我们简单地称之为no-arg(默认)A构造函数的调用。