gpt4 book ai didi

java - 带 OID 的值对象

转载 作者:行者123 更新时间:2023-11-30 12:01:42 29 4
gpt4 key购买 nike

您能描述一下包含 OID 的利弊吗? (通常是数据库行标识符)在 POJO 中在你的模型中代表一个实体?

事实上,我不是在谈论与 equals/hashcode 等相关的问题,我应该更好地描述我的问题(我的错 :) )......

我们有一些代表业务对象(如产品、目录等...)的实体类。有时他们有一个“业务 ID”,例如产品可以通过其唯一的 ProductId 找到(它有 3 个字段:id、类型、存储库)。

在我们的数据库中,Product 表除了 3 个业务列(id、type、repository)之外还有一个代理主键列 (OID),以方便外键引用并减少连接子句。

Product/ProductId 类是我们向其他应用程序公开的 API 的一部分。因此,例如他们可以调用:

productManager.findProductById(ProductId productId);

问题是,在知道我们的客户需要使用 ProductId 标识符的情况下,OID 是否应该包含在 Product 或 ProductId 类中。

优点:

  • 我可以使用 OID 进行另一次查找,例如

    Product p = productManager.findProductById(ProductId productId);
    Catalog c = productManager.findAllCatalogsContainingProduct(p.getOid());

我们习惯于通过 ProductId 在应用程序中进行大量查找,因此这节省了每次往返数据库的时间,以避免找到与 ProductId 匹配的 OID。

缺点:

  • 我刚刚将 OID 暴露给客户(希望他不要使用它来代替业务 key !!)

您能列出其他优点和缺点吗?

最佳答案

数据库行标识符=主键?如果是这样,则没有优缺点,您必须拥有它,否则您无法将 POJO 关联回其相应的数据库行。

要检索产品和目录,标准的 SQL 方法是执行联接。例如,使用我的 DAL,我可以:

SearchCriteria sc = new SearchCriteria();
sc.AddBinding("ProductId", productId);
List<Entity> Products = SQL.Read(sc, new Product(new Catalog());

List<Entity> Products = SQL.Read(sc, new Catalog(new Product());

这样就不需要向调用者透露任何信息,也不需要往返。

关于java - 带 OID 的值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/403549/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com