DAO / 存储库:插入/更新后的良好做法 return 值

DAO / repository: Good practice return value after insert / update

虽然这可能是一个微不足道的问题,但我一直想知道这个问题。

通常,在插入数据库后,通常的做法是 return 业务实体的 ID。

@Override
public Long createUser(UserEntity user) {
    em.merge(user); 
    em.flush(); 

    return user.getId(); 
}

return使用 id 而不是业务对象引用本身是否有令人信服的理由?

同样,我看到了 update return void,虽然它也可能是一个 id / User。

如果我要编写一个 DAO/Repository 供其他人使用,建议的 return 值是多少(如果有),为什么?

根据我的经验,在插入过程中 return 业务实体的 ID 是一个很好的做法,因为该 ID 可能会被完全用来继续业务流程,因为它是新输入的记录, 此外,对于更新过程,我们在更新记录之前获取实体,这意味着我们已经获得了 id ,因此没有必要 return id

我还认为 return 一般情况下使用 ID 是好的,即使不是最好的做法。或者您也可以 return 整个对象,但如果您在创建后不再需要使用它,这有点 "overhead"。

在 updating/altering 数据库中的一个对象中,我们总是 return 对象本身,或者很可能只是一个布尔值,无论更新是否成功,因为我们已经有了该对象。

如果 created/updated 成功,为什么不 return 整个实例? Spring 数据所做的相同,

<S extends T> S save(S entity);
<S extends T> Iterable<S> save(Iterable<S> entities);
  1. 如果我需要 created/updated 对象的另一部分,除了 id,我该怎么办? (namedate 对于 User 实体)。

  2. 为什么idreturn如果有几个字段可以准确表征一个实例(复合主键)?

整个对象 return 没有困难(@Danny Fonk 提到这里没有 "overhead" ),但它可能会在将来节省您的时间。

如果您 return 实体,客户端代码将如下所示:

MyEntity e = ...;
MyEntity created = dao.create(e);

但是"e"和"created"是同一个对象。这可能会导致混乱。您可能会争辩说,您将来可以更改 create 方法的实现,以便它确实 return 一个不同的实体。我见过这个。我不喜欢它。恕我直言,这是一个糟糕的持久性设计。

现在有一种情况我认为 returning id 是一个不错的选择:如果您在创建方法周围有一个事务边界 (REQUIRES_NEW)。通过事务边界传递 ID 而不是实体并不是一件坏事。