- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有下一个 ER 图
我想在每次保存 Score 实体时更新 PlayerStat 实体。所以我尝试使用 @PostPersist
注释。当我保存 Score 实体时,调用该注释的函数,但我在此函数中所做的更改不会持续存在。我的实现如下。所有实体类都有构造函数的 lombok 注释。
播放器
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Temporal(TemporalType.DATE)
@Getter
@NonNull
private Date createdAt;
@Column(unique = true)
@Getter
@Setter
@NonNull
private String nickname;
@OneToMany(mappedBy = "winner")
@Getter
@NonNull
private Set<Game> gamesWon;
@Getter
@OneToOne(cascade = CascadeType.PERSIST, optional = false)
@JoinColumn
private PlayerStat stat;
@OneToMany(mappedBy = "player")
@Getter
@NonNull
private Set<Score> scores;
public Player(String nickname, Date createdAt) {
this.nickname = nickname;
this.createdAt = createdAt;
stat = new PlayerStat(0, 0, 0, this);
}
游戏
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Getter
@NonNull
@Column(updatable = false)
private Integer durationMinutes;
@Temporal(TemporalType.DATE)
@Getter
@NonNull
private Date dateStarted;
@ManyToOne(optional = false)
@JoinColumn
@Getter
@NonNull
private Player winner;
@OneToMany(mappedBy = "game")
@Getter
private Set<Score> scores;
@PostPersist
private void update(){
System.out.println("On game post persist");
winner.getStat().incrementTotalWins();
}
玩家统计
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Getter
@Setter
@NonNull
private Integer totalScore;
@Getter
@NonNull
private Integer totalWins;
@Getter
@NonNull
private Integer totalGames;
@Getter
@OneToOne(mappedBy = "stat", optional = false)
@NonNull
private Player player;
public void incrementTotalWins() {
totalWins++;
}
public void incrementTotalGames() {
totalGames++;
}
得分
@Id
@GeneratedValue(generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@ManyToOne(optional = false)
@JoinColumn(name = "game_id")
@Getter
@NonNull
private Game game;
@ManyToOne(optional = false)
@JoinColumn
@Getter
@NonNull
private Player player;
@Getter
@NonNull
private Integer score;
@PostPersist
void updatePlayerStat(){
System.out.println("On score post persist");
player.getStat().incrementTotalGames();
player.getStat().setTotalScore(player.getStat().getTotalScore() + score);
System.out.println(player);
}
因此,我尝试保存单个Player、与该玩家的Game,以及与该游戏和玩家的Score。这两个函数都调用了 @PostPersist
注释。然后在另一个请求中我读了这个播放器。应用了游戏功能中的更改,但未应用得分功能中的更改。但是如果我像这样单独请求(它与实体监听器无关)
score.getPlayer().getStat().incrementTotalGames();
score.getPlayer().getStat().incrementTotalWins();
score.getPlayer().getStat().setTotalScore(100);
scoreRepository.save(score);
将应用所有更改。
我还尝试使用单独的 EntityListener 类并进入该类存储库,保存修改后的对象,但这也不起作用。我尝试在每个关系中添加 CascadeType.ALL
,仍然没有变化。那么我应该如何自动更新 PlayerStat?
最佳答案
如果您使用@PostPersist
,信息将在持久化后更新,因此您不会在数据库中拥有信息,因此您应该在将结果保存到数据库之前在服务层执行此增量操作,你也可以试试:
1- @PrePersist
因为 PrePersist 在实体管理器持久化操作实际执行或级联之前执行。此调用与持久化操作同步。
2-@PreUpdate
因为 PreUpdate 在数据库UPDATE 操作之前 执行。
关于java - 实体未在实体监听器@PostPersist(Spring 数据 jpa)上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278593/
我有一个带有名为“doAudit”的@PostPersist 方法的监听器来审核创建操作。在调试时我看到此方法被调用并且审核记录是在 JAVA 端创建的。但是当我验证数据库时,我没有看到记录。 pub
我有一个持久化实体对象的方法 persistData() 。我有另一个方法 findData() ,它对同一实体类执行 find() 操作以获取持久的主键值。当我在实体类的@PostPersist中调
我已经阅读了有关生命周期事件的文档,以及关于在生命周期事件期间更改或保留新实体的几个问题。调用EnitityManager::flush()似乎是个问题。 好的,但是 looking carefull
我想在实体上添加新的 Feed 项并持续更新。我写了这个事件监听器(postUpdate 是一样的): public function postPersist(LifecycleEventArgs $
我正在尝试在创建另一个实体的基础上创建一个新实体。示例:我有一段关系 Sale Payment 现在,当我坚持销售时,您必须创建一个初始付款,但我不知 Prop 体该怎么做。 我尝试过: 使用@OR
我在使用手动事务时插入/更新 3 个表。我想在事务提交后立即插入到历史表中。这意味着有 3 em.persist操作(对于每个表),并且只有在提交它们之后我才想调用一个方法。 这是我的代码: @Res
Doctrine 的事件监听类中的 postUpdate 和 postPersist 事件有什么区别?以我的理解,更新和插入都必须坚持下去。那么当可以在 postPersist 事件中处理它时,拥有
我正在尝试设置我的 hibernate 应用程序以在每次创建 Activity 实体时都保留一个新的 Notification 实体 - 目前,我已经尝试了 通知只是无法静默地持续存在(日志中没有错误
假设我有实体 Account: @Entity(name = "ACCOUNT") @EntityListeners(Listener.class) public class AccountEntit
我在数据库中出现双重插入的奇怪错误。我有以下类(class): TestEntity - 具有@PrePersist 和@PostPersist 方法的实体。 Auditoria - 审计实体 Dat
我目前正在使用 @PostPersist 和 @PostUpdate,在这些触发器中我正在持久化其他实体。问题是,这些触发器是否在同一事务中,如果不是,是否可以强制执行? 对我来说,它是这样工作的。当
我正在使用监听器来坚持和根据 Doctrine 进行更新。 唯一的问题是,当调用监听器时,它会创建并更新新的/当前的实体,因此它再次调用自身,从而创建两个实体。 我认为阻止这种情况的唯一方法是拥有一个
在 Symfony 中创建 Doctrine postPersist EventListener 后,我的 IDE 指向 $args->getEntity() 行;由于已被弃用,我不知道如何解决这个问
我有一个 JPA @Entity 类,它使用 @PrePersist 已经有一段时间了。今天我想在需要该实体 ID 的地方添加一些功能。此 ID 由数据库中的 HIBERNATE_SEQUENCE 持
我有一个用于测试 @EntityListeners 功能的小型测试应用程序。当我运行应用程序时,我得到以下堆栈跟踪 Exception in thread "main" org.springframe
我有下一个 ER 图 我想在每次保存 Score 实体时更新 PlayerStat 实体。所以我尝试使用 @PostPersist 注释。当我保存 Score 实体时,调用该注释的函数,但我在此函数中
每当在管理员中完成持久化或更新等操作时,我想创建一个静态 Twig 文件。我在想的是创建一个名为 GenerateStaticListener 的监听器。监听器将监听事件 postPersist 或
我是一名优秀的程序员,十分优秀!