当前位置: 首页 > 知识库问答 >
问题:

懒惰获取数据时的异常 - JUnit 测试

易淳
2023-03-14

我在尝试获取数据时收到异常,懒惰(最后异常)

//应用程序通过以下DAO获取数据。

    public T findById(PK id) {
    T result = getHibernateTemplate().get(this.type, id);
    getHibernateTemplate().flush();
    return result;
}  

//Junit测试调用serviceX.getById

    @Transactional
    public SomeObject getById(int x){
         return (SomeObject) aboveDao.findById(x);         

    }

//使用JUnit

 SomeObject someObj = serviceX.getById(3);
 someObj.getAnotherObject().y.equals("3"); //**Exception** at this line.

//某个对象类具有以下属性。

 @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)  
 private AnotherObject anotherObject;

当我尝试访问jUnit中的另一个对象时,我得到了以下异常

方法已在额外配置中尝试

我们使用TransactionManager的spring注释。

还有,我尝试添加@ Transaction(Propagation = Propagation。REQUIRED)在JUnit之上,这并没有解决问题。如果我运行该应用程序,它可以正常工作,没有任何问题。

如何为JUnit解决此类问题?

 org.hibernate.LazyInitializationException: failed to lazily initialize 
 a collection of role xxxxx , no session or session was closed

共有2个答案

彭宏阔
2023-03-14

这可能对你有用 LazyInitilializationException

柯书
2023-03-14

事情是这样的

SomeObject someObj = serviceX.getById(3); // @Transactional boundary, no more session
someObj.getAnotherObject().y.equals("3"); // session doesn't exist, can't fetch LAZY loaded object

因为您的antherObjectLAZY获取的,所以它实际上不会在getById()方法中加载。当@Transactional结束时,它关联的会话丢失,即。当执行从getById()返回时。因为不再有会话,所以您会得到异常

您可以将 FetchType 更改为 EAGER。如果要转到对象的该字段,则需要在事务边界中对其进行初始化。

如果您只在某些时候需要另一个对象,一种可能的解决方案是创建一个调用getById并急切加载该对象的@Transactional方法。

@Transactional
public SomeObject eagerGetById(int x){
    SomeObject obj = getById(x);
    obj.getAnotherObject(); // will force loading the object
    return obj;
}

每当您需要急切地加载对象时调用此方法。

 类似资料:
  • 我构建了一个有3个属性的帐户类:余额、所有者、acctNo。帐户类有2个构造函数,一个接受3个属性,一个不接受数据。帐户类有设置和获取方法以及存款和取款方法。 我还构建了一个类,该类从类扩展而来。将此类修改为类后,取款方法或此方法尝试将余额设置为零以下,将抛出。 JUnit测试人员修改测试方法,将尝试提取超过当前余额的可用,所以做测试方法。我需要修改JUnit测试透支帐户,以便它捕获异常,并捕获。

  • 我试图创建一个测试来验证我的代码(见下面的伪代码)是否正确捕获异常。我知道JUnit能够测试代码是否用以下代码抛出异常: 然而,我正在测试的软件的原始代码捕获了这个异常并打印了一条消息 JUnit是否有办法验证此消息?或者我应该改变一下我的流行语? 注:我已阅读,我应使用以下内容: 但是程序崩溃,因为它无法识别对象。 我尝试测试的方法的伪代码(出于隐私原因,不要发布确切的内容):

  • 我试图在primefaces数据表设置中实现延迟加载。目前,在没有延迟加载实现的情况下,这是可行的,但是在实现延迟加载后,我在datatable中没有得到任何数据。但是,我可以在我的LoadData方法中打印我的列表,以验证数据是否正在加载到我的列表中,但一旦返回我的LazyModel并尝试加载datatable,似乎就会出现问题。这可能只是我忽略的一些简单的事情。非常感谢您的帮助! 这是我的屏幕

  • 问题内容: 我真的是java的新手。 我正在构造函数上运行一些JUnit测试。构造函数是这样的:如果为其参数之一赋予null或空字符串,则应该抛出异常。 当我在JUnit中使用null或空字符串参数测试此构造函数时,即使我几乎100%确信将此类参数传递给它时,构造函数方法确实会引发异常,我也会看到一条红色的条。 如果该方法以预期的方式引发异常,则JUnit中是否应该没有绿色的条形?还是当异常抛出按

  • 问题内容: 编辑:目前没有JUnit 4。 嗨,您好, 我对使用JUnit进行“智能”异常测试有疑问。目前,我这样做是这样的: 如您所见,对于每个应该引发异常的函数,我都需要一个try / catch块。似乎不是执行此操作的好方法-还是没有可能减少try / catch的使用? 问题答案: 我建议您需要分解为多个单独的测试。各个try / catch块似乎彼此非常独立。您可能还希望将通用初始化逻辑

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。