在使用Springframework进行集成测试时,当集合为null而不是Hibernate代理时,缺少什么?
我对冬眠还不熟悉,并试图从测试开始。我被Grails在这方面的易用性宠坏了。。。我将Springframework 3.0.6与Hibernate3.6.8和JUnit4.9一起使用 我试图理解为什么下面的测试没有将Event对象中的EventAttribute集作为一组HibernateProxy对象“看到”,而只是将其视为null。此外,如果遵循事件的某些复合属性(由其他表中的对象组成的属性),则也不会看到值,而是看到null 对象在dao中保存得很好,我可以看到简单的属性(同一个表中的属性)。但是,assertNotNull在下面的测试中失败 我猜我的测试配置出了问题,因此会话已经关闭。想法 模型:在使用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中保存得很好,我可以看到简单的属性(同一个表中的属性
@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());
}
}