customer = // get customer from the current hibernate session
// customer has a discount with database id of 1
直到这里一切都很好。但如果我打电话:
discount = SpecialDiscount.create("10%");
customer.setDiscountTo(discount);
session.save(customer);
// customer has a discount with database id of 2 now
hibernate如何更新ID为2的相同折扣行,即使我已将其设置为另一个折扣值对象?此外,我想通过分离前一个左右来防止“具有相同身份的对象已存在”错误。你有什么建议?
// An entity
class Customer {
// one-to-one mapped immutable value object
SpecialDiscount discount;
SpecialDiscount discount() {
return SpecialDiscount.create(this.discount);
}
void setDiscountTo(SpecialDiscount discount) {
this.discount = SpecialDiscount.create(discount);
}
}
答案 0 :(得分:0)
你还没有发布你的映射,这使得无法准确诊断问题,你的访问者方法看起来很奇怪(你为什么要通过SpeciaalDiscount.create()
包装所有内容?你甚至在set上使用示例执行两次你发布了。)
也就是说,如果你确实将客户映射为折扣一对一(正如你在评论中所说的那样),那么Hibernate的行为应该如此(更新现有的“折扣”记录)。也许你应该使用多对一(再次,很难说肯定而不理解你想要做什么)。
答案 1 :(得分:0)
id
列可能会通过Hibernate和数据库自动递增。张贴您的映射,并检查数据库中的列属性。这将有助于每个人诊断问题。
另一件事。 (我只熟悉NHibernate,所以这可能不适用。)要进行行更新,通常需要调用Update()
或SaveOrUpdate()
而不是Save()
。调用Save()
是否修改现有记录,或使用id = 2
在数据库中创建新记录?
答案 2 :(得分:0)
要存储具有一对一映射的不可变值对象,理想情况下应使用hibernate术语中的嵌入对象组件。可以找到更多详细信息here。
发布您的映射,您应该得到更多回复:)