代码之家  ›  专栏  ›  技术社区  ›  Amit

hibernate-一个设计问题

  •  1
  • Amit  · 技术社区  · 15 年前

    我在学习Hibernate的教程 JBoss 网站。我在一个位于 here .

    有一个 Cat 类别代码位于 4.1. A simple POJO example .

    这个 班上有人提到他的母亲 private Cat mother;

    Q1。如果类的标识符属性为 id ,那么最好是存储猫妈妈的ID,而不是存储猫妈妈的对象。

    手段而不是

    private Cat mother;
    

    是不是更好

    private long motherId; 
    

    `

    3 回复  |  直到 15 年前
        1
  •  4
  •   Jack    15 年前

    这就是hibernate隐式地为您做的事情。

    好消息是 ORM 它完全隐藏了实现注意事项,因为您正在 关系数据库管理系统 而不是用普通的物体。你可以使用 mother 作为 Cat 不用担心它的关系 id 内部的。

        2
  •  1
  •   vfilby    15 年前

    不一定,存储对象引用而不是id是有益的,因为它隐式地验证引用,其中id可以是任何数字、有效的cat id或其他。这是一个额外的验证和错误检查层,你必须处理。

    唯一需要小心的陷阱是序列化对象,并确保没有无限循环,DTO可以提供帮助。例如,假设要将cat序列化为webservice,并且只想序列化单个cat,而不是整个cat层次结构(cat、cat的母亲、cat的母亲等)。你可以创建一个 数据传输对象 这是car类的一个瘦包装,这个包装可以序列化id,而不是引用的对象,这样使用户可以在需要的时候获得母亲。DTO还有其他好处,比如在底层域对象可以更改以最适合代码基的情况下,维护一个常量接口。

        3
  •  1
  •   radai    15 年前

    除上述原因外,简单易用性如何? 如果我想使用您的设计遍历一个家族树,代码将类似于:

    Cat firstCat = //get starting cat somehow
    Object someBroker = //get a 3rd party broker (like an entity manager)
    Cat parent = broker.getCatById(firstCat.getParentId());
    

    在更优雅的同时使用实际的对象引用:

    Cat firstCat = // get initial cat
    while ((Cat ancestor = firstCat.getParent)!=null) {
       //work with ancestor
    }