gpt4 book ai didi

java - 透明地记录 JPA 实体上最后修改的用户

转载 作者:行者123 更新时间:2023-11-30 11:50:44 25 4
gpt4 key购买 nike

我发现下面答案中的技术对于透明地管理实体的创建和更新时间戳非常有用:

hard time setting autogenerated time with hibernate JPA annotations

我想知道是否有类似的东西来记录实体的创建和更新用户?

@PreUpdate
@PrePersist
public void updateAudit() {
lastModifiedDate = new Date();
lastModifiedUser = ??;
if (dateCreated==null) {
dateCreated = new Date();
userCreated = ??;
}
}

虽然示例中的 new Date() 提供了当前时间,但我无法找到可以存储用户 ID(在登录时)的位置,该位置可从 @PrePersist 访问实体上的注释方法。

@Produces 方法注入(inject) @LoggedInUser 是理想的,但我的实体是由 new() 创建的,而不是通过注入(inject)创建的,所以不受管理。

我对此很陌生,所以我希望我遗漏了一些明显的东西。谢谢。

[编辑] 下面从 prunge 到代码的答案(删节)

@MappedSuperclass
public abstract class BaseEntity implements Serializable, Comparable<BaseEntity> {

@Version
private Timestamp updatedTimestamp;

private static ThreadLocal<Long> threadCurrentUserId = new ThreadLocal<Long>();

/* Called from entry point like servlet
*/
public static void setLoggedInUser(BaseEntity user) {
if (user!=null) threadCurrentUserId.set(user.getId());
}

@PrePersist
@PreUpdate
protected void onCreateOrUpdate() {
//Note we don't have to update updatedTimestamp since the @Version annotation does it for us
if(createdTimestamp==null) createdTimestamp = new Timestamp(new Date().getTime());;

lastUpdatedByUserId = threadCurrentUserId.get();
if(createdByUserId==null) createdByUserId = lastUpdatedByUserId;
}

最佳答案

如果它是一个网络应用程序,您可以使用 ThreadLocal 来存储当前用户。

  • 在 servlet 过滤器中设置 ThreadLocal 值,从 servlet 请求中读取用户。
  • 从您的 JPA 实体中读取 ThreadLocal 值。
  • 通过过滤器清除回程中的值。

关于java - 透明地记录 JPA 实体上最后修改的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com