如何加载同一行两次并避免hibernate异常

时间:2017-05-24 00:08:30

标签: java spring hibernate

我正在尝试从外部源加载一些数据。我正在获取数据,然后使用hibernate创建对象,然后将所有内容添加到我的数据库。

在一个案例中,我有两个相互关联的实体类。 Item.java和service.java。可以将与项目相关联的相同服务两次但具有不同的价格。在数据库中,这将是三个表

  1. 项目
  2. 服务
  3. vice(item_id,service_id,price)
  4. 对象将是

    Item.java

    @Id
    @Column(name = "id")
    private Long id;
    
    // Other attributes
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.item", cascade = CascadeType.ALL)
        private Set<ItemService> itemServices = new HashSet<ItemService>();
    

    ItemService.java

    @EmbeddedId
        private ItemServicePK id = new ItemServicePK();
    
        @Column(name = "price")
        private String price;
    
        // Other attributes
    

    当我导入我正在创建的数据并将服务对象保存到数据库时。然后我创建项目对象并将适当的服务与项目相关联。 这是执行该操作的代码:

    //Create item object
    
    Item item = new Item();
    item.setId((Long) jsonObj.get("id"));
    
    //Add the services
    
    for(int x = 0; x < service.size(); x++) {
       JSONObject serviceObj = (JSONObject) services.get(x);
       Service service = serviceDAO.getServiceById(Long.valueOf(serviceObj.get("service_id").toString()));
       ItemService itemService = new ItemService();
       itemService.setItem(item);
       itemService.setService(service);
       itemService.setPrice(serviceObj.get("price").toString());
       item.getItemServices().add(itemService);
    }
    

    这就是我正在检索服务的方式:

    @Transactional
        public Service getServiceById(Long id) {
            Session session = this.sessionFactory.getCurrentSession();
            return (Service) session.load(Service.class, new Long(id));
        }
    

    我使用以下方法将项目添加到数据库中:

    Session session = getSession();
        for(Item item : items) {
            session.saveOrUpdate(item);
        }
    

    问题是我得到了例外saying an object with the same identifier is in the session。我知道这是因为有时我有两个服务,这些服务具有相同的Id与项目相关联但价格不同。我尝试过使用session.merge,但这会导致Java.lang.StackOverflow异常。

    有没有办法克服这个问题。例如,我可以检查它是否存在于会话中并检索该对象,而不是使用DAO两次获取同一对象?

    欢迎任何其他解决方案。

0 个答案:

没有答案