在Hibernate中使用自动增量更新现有条目

时间:2015-11-23 06:10:25

标签: hibernate duplicates unique

我有一个类使用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的重复条目。

如何避免重复输入并更新现有条目?

1 个答案:

答案 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;
 ...