gpt4 book ai didi

java - Spring、Hibernate 和 AbstractTransactionalJUnit4SpringContextTests : objects with multiple mappings to same underlying data cannot be found

转载 作者:行者123 更新时间:2023-12-01 05:03:29 25 4
gpt4 key购买 nike

我已经使用 AbstractTransactionalJUnit4SpringContextTests 成功为 Spring 2.5.6/Hibernate 3.5.3 项目创建了许多与数据库相关的单元测试。 。一个示例,创建一个 Device 对象,然后验证该对象是否包含在所有 Device 对象的列表中:

@ContextConfiguration(locations = { "classpath:/UnitTests-context.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class DeviceDaoTests extends AbstractTransactionalJUnit4SpringContextTests {

@Test
public void testGetDeviceList() {
Device device = new Device();
this.sessionFactory.getCurrentSession().merge(device);

Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from Device");
List<Device> allDevices = myQuery.list();
assertTrue(allDevices.contains(device);
}
}

此测试有效。

Device 类,映射到名为 DEVICES 的表:

@Entity
@Table(name = "DEVICES")
public class Device {

//properties omitted for brevity and readability

}

还有一个名为 DeviceListItem 的类,它映射到名为 DEVICESLIST_VIEW 的数据库 View ,其中包含 DEVICES 表(以及其他表)的部分内容:

@Entity
@Table(name = "DEVICESLIST_VIEW")
public class DeviceListItem {

//properties omitted for brevity and readability

}

现在,如果我想测试在数据库中插入设备是否会导致从所有 DeviceListItem 对象的列表中找到具有相同 id 的 DeviceListItem(与第一个测试类似),则会出现问题 - 以下测试失败:

   @Test
public void testGetDeviceListItemList() {
Device device = new Device();
this.sessionFactory.getCurrentSession().merge(device);

Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from DeviceListItem");
List<DeviceListItem> allDeviceListItems = myQuery.list();
assertTrue(allDeviceListItems.get(0).getId().equals(device.getId())
}

在 Web 服务器上运行应用程序时,所有映射、DAO 类等都可以工作 - 只有前面提到的单元测试失败。这可能是因为保存了一个 Device 类型的新对象,但读取的项目是 DeviceListItem 类型,并且 Hibernate 不“知道”它们都引用相同的底层数据库表,因为对象并未真正保存到数据库中。

有没有办法让这个测试起作用,即测试将 Device 对象写入数据库并作为 DeviceListItem 对象从数据库读取的场景?

(请注意,代码示例中可能存在拼写错误、风格问题等,因为这些示例经过了极大简化,不一定是从实际执行的代码中复制/粘贴的)

最佳答案

通过添加注解解决

@Rollback(false)

(参见 http://static.springsource.org/spring/docs/2.5.6/reference/testing.html )方法

testGetDeviceListItemList

(参见原始问题)。但是,这也意味着 Spring 单元测试上下文不会自动回滚,因此我必须手动确保数据库状态恢复正常:

this.sessionFactory.getCurrentSession().delete(device);

完整方法:

       @Rollback(false)
@Test
public void testGetDeviceListItemList() {
Device device = new Device();
this.sessionFactory.getCurrentSession().merge(device);

Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from DeviceListItem");
List<DeviceListItem> allDeviceListItems = myQuery.list();
assertTrue(allDeviceListItems.get(0).getId().equals(device.getId());

this.sessionFactory.getCurrentSession().delete(device);
}

关于java - Spring、Hibernate 和 AbstractTransactionalJUnit4SpringContextTests : objects with multiple mappings to same underlying data cannot be found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com