Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用Springframework进行集成测试时,当集合为null而不是Hibernate代理时,缺少什么?_Hibernate_Spring_Junit4 - Fatal编程技术网

在使用Springframework进行集成测试时,当集合为null而不是Hibernate代理时,缺少什么?

在使用Springframework进行集成测试时,当集合为null而不是Hibernate代理时,缺少什么?,hibernate,spring,junit4,Hibernate,Spring,Junit4,我对冬眠还不熟悉,并试图从测试开始。我被Grails在这方面的易用性宠坏了。。。我将Springframework 3.0.6与Hibernate3.6.8和JUnit4.9一起使用 我试图理解为什么下面的测试没有将Event对象中的EventAttribute集作为一组HibernateProxy对象“看到”,而只是将其视为null。此外,如果遵循事件的某些复合属性(由其他表中的对象组成的属性),则也不会看到值,而是看到null 对象在dao中保存得很好,我可以看到简单的属性(同一个表中的属性

我对冬眠还不熟悉,并试图从测试开始。我被Grails在这方面的易用性宠坏了。。。我将Springframework 3.0.6与Hibernate3.6.8和JUnit4.9一起使用

我试图理解为什么下面的测试没有将Event对象中的EventAttribute集作为一组HibernateProxy对象“看到”,而只是将其视为null。此外,如果遵循事件的某些复合属性(由其他表中的对象组成的属性),则也不会看到值,而是看到null

对象在dao中保存得很好,我可以看到简单的属性(同一个表中的属性)。但是,assertNotNull在下面的测试中失败

我猜我的测试配置出了问题,因此会话已经关闭。想法

模型:

@Entity
@Table(name = "event")
public class Event {

  /**
      ... some other properties ...
  */

  @OneToMany(mappedBy = "event")
  private Set<EventAttribute> eventAttributes = new HashSet<EventAttribute>(0);

  /**
      ... getters and setters ...
  */
}

@Entity
@Table(name = "event_attribute")
public class EventAttribute {

  /**
      ... some other properties ...
  */
  @ManyToOne(fetch = FetchType.LAZY)
  @ForeignKey(name = "FK_event_attribute_event")
  @JoinColumn(name = "event_id", nullable = false)
  private Event event;

  /**
      ... getters and setters ...
  */
}

问题是hibernate不会为您维持双向关系的两端

因此,只要不从数据库重新加载事件,集合就不会被更新。在您的情况下,问题是,
event2
将不会从数据库中再次加载,因为它已在当前hibernate会话中显示

您可以通过
assertSame(event2,event)//来证明这一点。请注意,SAME不仅等于

因此,如果在加载第二个事件之前刷新并清除会话,那么hibernate将真正从db加载它并创建一个新的对象实例。在这种情况下,它还将以您期望的方式初始化
集合


但是:我个人认为,这是一个糟糕的代码。更好的方法是手动维护关系的双方。因此,如果创建一个新的EventAttribute,它应该自己注册到事件中,更改时也是如此。这样,即使对象未存储在数据库中,最终也能正确地维护相关性。

这是一个好消息。我没有意识到hibernate会将完全相同的对象返回给我。但是,我的问题比不返回的集合稍微大一些。在测试中,除了作为事件对象一部分的简单类型之外,我无法在对象图中进一步查看任何内容。例如,我可以看到活动的日期和id,但我看不到参与者的任何详细信息。@Daniel:听起来很奇怪,“但我看不到参与者的任何详细信息”。请您发布更多详细信息,以便代码更准确。(Persistence.xml,Test,…)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("dao-testConfig.xml")
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class EventAttributeDaoTest  {

  @Test
  public void save(){
    EventAttribute eventAttribute = new EventAttribute("a key", "a value", event);
    dao.save(eventAttribute);

    Event event2 = eventDao.getEventById(event.getId());
    assertNotNull(event2.getEventAttributes());
  }
}