我有一个类使用Hibernate映射到db表的Price。就像这样:
Price {
long priceID; //auto increment, Primary key
long itemID; // Foreign key, each price corresponds to a unique Item
double price; // actual price
}
我想要的是在使用现有itemID保存价格对象时,它会使用相同的itemID更新db中现有条目的价格。
但它最终创建了一个具有相同itemID的重复条目。
如何避免重复输入并更新现有条目?
答案 0 :(得分:1)
您可以实现以下内容:
引入一种方法来检查数据库中是否已存在项目:
// Session session= ...
public Map<Integer, Item> getItemIfExist(String item_name) {
Map<Integer, Item> returnMap = new HashMap<>();
Criteria cr = session.createCriteria(Item.class);
cr.add(Restrictions.eq("itemName", item_name));
List<Item> items = cr.list();
for (Item item : items) {
Set<Price> price = item.getPrices();
for (Price p : price) {
returnMap.put(p.getPriceId(), item);
}
}
return returnMap;
}
如果项目已在数据库中,您可以更新现有项目的价格:
String item_name = "Water";//this may vary according to your requirement
double newPrice = 4.50;//as well as the price
if (!checkItemIfExist(item_name).isEmpty()) {
for (Map.Entry<Integer, Item> entry : checkItemIfExist(item_name).entrySet()) {
int priceId = entry.getKey();
Item item = entry.getValue();
session.beginTransaction();
Price price = (Price) session.load(Price.class, priceId);
price.setItem(item);
price.setPrice(newPrice);
session.update(price);
session.getTransaction().commit();
}}
此外,您可以将其作为新项目保存到数据库:
else {
session.beginTransaction();
Item item = new Item(item_name);
Price price = new Price(item, newPrice);
session.save(price);
session.getTransaction().commit();
}
更新:
项目实体类: -
public class Item implements java.io.Serializable {
private Integer itemId;
private String itemName;
private Set<Price> prices = new HashSet<>();
...
价格实体类: -
public class Price implements java.io.Serializable {
private Integer priceId;
private Item item;
private double price;
...