【问题标题】:Hibernate Immutable Value ObjectHibernate 不可变值对象
【发布时间】:2009-10-09 16:37:57
【问题描述】:
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

即使我已将其设置为另一个折扣值对象,休眠如何更新 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);
    }
}

【问题讨论】:

  • 什么时候出现“已经存在具有相同标识的对象”错误?

标签: hibernate object mapping domain-driven-design


【解决方案1】:

要存储具有一对一映射的不可变值对象,您最好使用休眠术语中的组件,即嵌入式对象。更多详情请见here

也可以看看@Immutable annotation

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

【讨论】:

    【解决方案2】:

    您还没有发布映射,这使得无法准确诊断问题,而且您的访问器方法看起来很奇怪(为什么要通过 SpeciaalDiscount.create() 包装所有内容?您甚至使用示例在现场做了两次)已发布)。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        相关资源
        最近更新 更多