我正在尝试从外部源加载一些数据。我正在获取数据,然后使用hibernate创建对象,然后将所有内容添加到我的数据库。
在一个案例中,我有两个相互关联的实体类。 Item.java和service.java。可以将与项目相关联的相同服务两次但具有不同的价格。在数据库中,这将是三个表
对象将是
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两次获取同一对象?
欢迎任何其他解决方案。