【发布时间】:2021-07-14 08:35:42
【问题描述】:
我在 Hibernate 中使用 Spring Data JPA。
假设我定义了以下实体:
@Entity
@Table(name = "foods")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "food_id")
private Long foodId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "food_type_id")
@NotNull
private FoodType foodType;
...
}
@Entity
@Table(name = "food_types")
public class FoodType {
public static final Integer PERISHABLE;
public static final Integer NON_PERISHABLE;
@Id
@Column(name = "food_type")
private Integer foodTypeId;
private String name;
...
}
每当我想创建一个Food 实体并将其保存到数据库时,当前代码如下所示:
Food food = new Food();
FoodType foodType = foodTypeRepository.findById(FoodType.PERISHABLE); // Call to DB to get Entity
food.setFoodType(foodType);
....
foodRepository.save(food);
如果我们认为 FoodType 在数据库中是常量。我可以这样使用吗:
Food food = new Food();
FoodType foodType = new FoodType();
foodType.setFoodTypeId(FoodType.PERISHABLE); // No Call to DB
food.setFoodType(foodType);
....
foodRepository.save(food);
我已经测试过了,是的,我可以这样使用它,hibernate 会保存Food 实体,但是有什么缺点、陷阱等...我没有看到。
PS。这只是一个说明这个想法的简单示例,它是旧遗留项目的一部分,我无法修改它以从 DB 中删除常量,而是使用枚举。
【问题讨论】:
-
„getById(..)“如果persistanceprovider支持的话,应该只返回一个没有数据库调用的代理。在休眠状态下,它被称为“getReference(..)”。
-
这个
foodType.setFoodTypeId()不应该作为公共方法公开,也不应该被调用。您可以缓存食物类型,以免每次都加载它们。
标签: java spring hibernate spring-data-jpa spring-data