Java 具有OID的值对象

Java 具有OID的值对象,java,pojo,oid,Java,Pojo,Oid,您能否描述在表示模型中实体的中包含(通常是数据库行标识符)的优点和缺点 事实上,我不是在谈论与equals/hashcode等相关的问题,我应该更好地描述我的问题(我的坏:) 我们有一些表示业务对象(如产品、目录等)的实体类。有时他们有一个“业务id”,例如,产品可以通过其唯一的ProductId(它有3个字段:id、类型、存储库)找到 在我们的数据库中,除了3个业务列(id、type、repository)之外,Product表还有一个代理主键列(OID),以方便外键引用和减少连接子句 Pro

您能否描述在表示模型中实体的中包含(通常是数据库行标识符)的优点和缺点

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

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

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

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

productManager.findProductById(ProductId productId);
问题是,OID是否应该包含在产品或ProductId类中,因为我们的客户需要使用ProductId标识符

优点:

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

    Product p = productManager.findProductById(ProductId productId);
    Catalog c = productManager.findAllCatalogsContainingProduct(p.getOid());
    
我们习惯于通过ProductId在应用程序中查找很多内容,因此这可以节省每次往返数据库的时间,以避免找到与ProductId匹配的OID

缺点:

  • 我刚刚向客户公开了OID(希望他不要用它来代替业务密钥!!)

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

数据库行标识符=主键?如果是这样的话,就没有正反两个方面,您必须拥有它,否则就无法将POJO关联回其对应的数据库行

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

SearchCriteria sc = new SearchCriteria();
sc.AddBinding("ProductId", productId);
List<Entity> Products = SQL.Read(sc, new Product(new Catalog());
SearchCriteria sc=新的SearchCriteria();
sc.AddBinding(“ProductId”,ProductId);
List Products=SQL.Read(sc,新产品(newcatalog());

List Products=SQL.Read(sc,新目录(new Product());

通过这种方式,无需向调用者透露任何信息,也无需往返。

如果equals()或hashCode()的实现是基于标识符的,则可能会遇到问题,因为它最初可能为null,然后在对象持久化后更改。请参阅以下内容:

注意:如果可变对象用作集合元素,则必须非常小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的一个元素,则不指定集合的行为。这种禁止的一种特殊情况是,不允许集合将自身包含为一个元素耳鼻喉科

假设hashCode()的实现基于标识符,equals()使用hashCode()在其比较中。如果将对象添加到集合中且其标识符为null,则equals比较将以一种方式执行。如果随后将对象持久化到集合中,则其标识符值可能会更改,从而更改equals()和hashCode()的行为。这将打破集合的“约定”,如上所述


这是一个边缘案例,但值得注意。

当然,你是对的,但这不是我问题的重点,很抱歉,我对这一点太疏漏了。。。
List<Entity> Products = SQL.Read(sc, new Catalog(new Product());