如何解决休眠收集缓存问题
| 我有以下2个Hibernate实体:@Entity
@Table(name = \"VEHICLE_BRAND\")
public class VehicleBrand implements java.io.Serializable {
...
@Column(name = \"NAME\",nullable = false,length = 1000)
public String getName() {
return name;
}
@OneToMany(fetch = FetchType.LAZY,mappedBy = \"vehiclebrand\")
public Set<VehicleModel> getVehicleModels() {
return vehicleModels;
}
...
}
和
@Entity
@Table(name = \"VEHICLE_MODEL\")
public class VehicleModel implements java.io.Serializable {
...
@Column(name = \"NAME\",length = 1000)
public String getName() {
return name;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name=\"VECHILE_BRAND_ID\")
public VehicleBrand getVehicleBrand() {
return this.vehicleBrand;
}
...
}
我有以下用于测试VehicleBrand和VehicleModel的单元测试:
DefaultTransactionDefinition txDef = new DefaultTransactionDefinition();
txDef.setName(\"test1\");
txDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus txStatus = txManager.getTransaction(txDef);
// Load brand \"1\" object.
VehicleBrand brand = (VehicleBrand) factory.getVehicleBrandDAO().findFirstByName(\"1\");
assertNotNull(brand);
// Check if model \"X\" exists for brand \"1\" through collection.
Set<VehicleModel> models = brand.getVehicleModels();
for (final VehicleModel model : models) {
assertFalse(model.getName().equals(\"X\"));
}
// Add model \"X\" to brand \"1\".
VehicleModel model = new VehicleModel();
model.setName(\"X\");
model.setValidFrom(new Date());
model.setVehicleBrand(brand);
factory.getVehicleModelDAO().create(model);
txManager.commit(txStatus);
txDef = new DefaultTransactionDefinition();
txDef.setName(\"test2\");
txDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txStatus = txManager.getTransaction(txDef);
// Check that model is added to database.
model = (VehicleModel) factory.getVehicleModelDAO().findFirstByName(\"X\");
assertNotNull(model);
assertEquals(model.getVehicleBrandId().longValue(),1L);
// Check if model X exists for brand \"1\" through collection.
brand = (VehicleBrand) factory.getVehicleBrandDAO().findFirstByName(\"1\");
models = brand.getVehicleModels();
boolean found = false;
for (final VehicleModel model2 : models) {
if (model2.getName().equals(\"X\")) {
found = true;
}
}
assertTrue(found);
txManager.commit(txStatus);
有人可以解释一下为什么最后一行失败吗?
解决方法
它肯定会失败,因为您正在同一事务中执行所有这些操作,因此始终从会话缓存中返回同一VehicleBrand实例。
由于您在创建VehicleModel时忘记了维护关联的双方(即,您将品牌分配给了新模型,但是却忘记了将创建的模型添加到品牌的模型集合中),因此相同的模型集是始终返回,并且不包含新创建的模型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。