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);
如果我需要 created/updated 对象的另一部分,除了 id
,我该怎么办? (name
、date
对于 User
实体)。
为什么id
return如果有几个字段可以准确表征一个实例(复合主键)?
整个对象 return 没有困难(@Danny Fonk 提到这里没有 "overhead" ),但它可能会在将来节省您的时间。
如果您 return 实体,客户端代码将如下所示:
MyEntity e = ...;
MyEntity created = dao.create(e);
但是"e"和"created"是同一个对象。这可能会导致混乱。您可能会争辩说,您将来可以更改 create 方法的实现,以便它确实 return 一个不同的实体。我见过这个。我不喜欢它。恕我直言,这是一个糟糕的持久性设计。
现在有一种情况我认为 returning id 是一个不错的选择:如果您在创建方法周围有一个事务边界 (REQUIRES_NEW)。通过事务边界传递 ID 而不是实体并不是一件坏事。
虽然这可能是一个微不足道的问题,但我一直想知道这个问题。
通常,在插入数据库后,通常的做法是 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);
如果我需要 created/updated 对象的另一部分,除了
id
,我该怎么办? (name
、date
对于User
实体)。为什么
id
return如果有几个字段可以准确表征一个实例(复合主键)?
整个对象 return 没有困难(@Danny Fonk 提到这里没有 "overhead" ),但它可能会在将来节省您的时间。
如果您 return 实体,客户端代码将如下所示:
MyEntity e = ...;
MyEntity created = dao.create(e);
但是"e"和"created"是同一个对象。这可能会导致混乱。您可能会争辩说,您将来可以更改 create 方法的实现,以便它确实 return 一个不同的实体。我见过这个。我不喜欢它。恕我直言,这是一个糟糕的持久性设计。
现在有一种情况我认为 returning id 是一个不错的选择:如果您在创建方法周围有一个事务边界 (REQUIRES_NEW)。通过事务边界传递 ID 而不是实体并不是一件坏事。