代码之家  ›  专栏  ›  技术社区  ›  Inanc Gumus

休眠不可变值对象

  •  0
  • Inanc Gumus  · 技术社区  · 15 年前
    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 回复  |  直到 12 年前
        1
  •  0
  •   Sudarshan    12 年前

    要用一对一的映射来存储一个不可变的值对象,您最好在Hibernate术语中使用组件aka embedded objects。可以找到更多详细信息 here .

    也可以看看 @Immutable annotation

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

        2
  •  0
  •   ChssPly76    15 年前

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

    这就是说,如果您确实将客户映射为一对一的折扣(正如您在评论中所说),Hibernate会按照它应该的方式(更新现有的“折扣”记录)。也许你应该用“多对一”来代替(同样,在不理解你想做什么的情况下,很难确定)。

        3
  •  0
  •   Jon Seigel    15 年前

    可能发生了什么事 id 列通过休眠和数据库自动递增。发布映射,并检查数据库中的列属性。这将帮助每个人诊断问题。

    还有一件事。(我只熟悉nhibernate,所以这可能不适用。)要进行行更新,通常需要调用 Update() SaveOrUpdate() 而不是 Save() . 打电话给 保存() 修改现有记录,或在数据库中使用 id = 2 ?