spring-data-jpa 如何正确地实现使用JPA/Hibernate修改其他实体的实体?

hmae6n7t  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(213)

我是“普通”后端开发的新手,我正在尝试为我的Spring Web应用程序实现评论系统。这里的问题是,如果一个评论被否决,那么评论所有者的“报应”也必须减少。
现在,我有一些用PHP开发Web的经验,使用一些自制的spaghetti编码框架,可以用下面这样的代码实现上述逻辑:

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传递给downvote方法可以实现类似的效果,方法如下:

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)
    }
}

我也有过一个想法,把这个逻辑放在控制器里,但那个想法似乎也是一个糟糕的做法...
所以,我有一个实体(注解),它应该在修改(调用downvote)时修改另一个实体(用户),我不知道如何以类似JPA的方式实现所有这些。

s6fujrry

s6fujrry1#

首先,您应该将逻辑(例如,事务操作)与实体分离。
实体应该(或多或少)是一个pojo,您可以为这些业务逻辑实现创建另一个类。
典型的体系结构是:

  • 实体:pojos
  • DAO或储存库:每个存储库通常与一个实体类对话(读/写
  • 服务(在这里,您可以通过所需的存储库修改任意数量的实体)

相关问题