Hibernate不可变值对象

时间:2009-10-09 16:37:58

标签: hibernate object mapping domain-driven-design

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);
    }
}

3 个答案:

答案 0 :(得分:0)

你还没有发布你的映射,这使得无法准确诊断问题,你的访问者方法看起来很奇怪(你为什么要通过SpeciaalDiscount.create()包装所有内容?你甚至在set上使用示例执行两次你发布了。)

也就是说,如果你确实将客户映射为折扣一对一(正如你在评论中所说的那样),那么Hibernate的行为应该如此(更新现有的“折扣”记录)。也许你应该使用多对一(再次,很难说肯定而不理解你想要做什么)。

答案 1 :(得分:0)

id列可能会通过Hibernate和数据库自动递增。张贴您的映射,并检查数据库中的列属性。这将有助于每个人诊断问题。

另一件事。 (我只熟悉NHibernate,所以这可能不适用。)要进行行更新,通常需要调用Update()SaveOrUpdate()而不是Save()。调用Save()是否修改现有记录,或使用id = 2在数据库中创建新记录?

答案 2 :(得分:0)

要存储具有一对一映射的不可变值对象,理想情况下应使用hibernate术语中的嵌入对象组件。可以找到更多详细信息here

另请查看@Immutable annotation

发布您的映射,您应该得到更多回复:)