如何正确实现用JPA/Hibernate修改其他实体的实体



我对"正常的";后端开发,我正在尝试为我的SpringWeb应用程序实现注释系统。这里的问题是,如果一条评论被否决,那么评论所有者的";因果报应;也必须递减。

现在,我有了一些用PHP和一些自制的意大利面条编码框架进行web开发的经验,在那里可以用类似的东西来实现上述逻辑:

class Comment {
function getUser() { return db_find("users", User::class, $this->columns->owner); }
function downvote() {
$user = $this->getUser();
$user->columns->karma--;
db_persist("users", $user);
}
}

JPA bean的制作方式不同,所以我无法重新应用上面的解决方案,尽管我最初的想法非常相似。我相信有可能通过以下方式将Session传递给否决权方法来实现类似的目标:

class Comment {
// ...
@ManyToOne
@JoinColumn(name = "owner_id")
var owner: User? = null
fun downvote(session: Session) {
this.rating -= 1;
this.owner.karma -= 1;
session.save(this.owner)
session.save(this)
}
}

但对我来说,这似乎真的是错误和不自然的。我也有一个想法,把这个逻辑放在控制器里,但这似乎也是一个糟糕的做法。。。

所以,我有一个实体(注释(应该在修改(调用downpvote(时修改其他实体(用户(,我不知道如何以类似JPA的方式实现所有这些。

首先,您应该将逻辑(例如,事务操作(与实体分离。

实体应该(或多或少(是一个pojo,您可以为这些业务逻辑实现创建另一个类。

一个典型的体系结构是:

  • 实体:pojos
  • dao或存储库:每个存储库通常与一个实体类进行对话(读/写(
  • 服务(在这里,您可以通过所需的存储库根据需要修改任意多个实体(

最新更新