gpt4 book ai didi

java - Hibernate集合缓存问题

转载 作者:行者123 更新时间:2023-12-01 15:49:16 25 4
gpt4 key购买 nike

我有以下 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", nullable = false, 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);

有人可以解释一下为什么最后一行失败吗?

最佳答案

它肯定会失败,因为您在同一事务中执行所有这些操作,因此始终从 session 缓存返回相同的 VehicleBrand 实例。

由于您在创建 VehicleModel 时忘记维护关联的双方(即您将品牌分配给新模型,但忘记将创建的模型添加到品牌的模型集合中),因此同一组模型是总是返回,并且不包含新创建的模型。

关于java - Hibernate集合缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6452228/

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