当前位置: 首页 > 面试题库 >

@CreatedBy和@LastModifiedBy设置实际实体而不是id

唐烨煜
2023-03-14
问题内容

我有一个看起来像的实体:

@Audited
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

  public static final long UNSAVED = 0;

  @Id
  @GeneratedValue
  private long id;

  @CreatedDate
  @Column(name = "created_at", updatable = false)
  private ZonedDateTime createdAt;

  @CreatedBy
  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "created_by")
  private User createdBy;

  @LastModifiedDate
  private ZonedDateTime updatedAt;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "updated_by")
  @LastModifiedBy
  private User updatedBy;

}

我想要@LastModifiedBy和@CreatedBy,以便它们设置相应的用户。但是,当我尝试保存实体时,出现异常:

java.lang.ClassCastException: Cannot cast java.lang.Long to com.intranet.users.Users

因此在我看来,它尝试设置的不是实际用户,而是ID。有什么方法可以使spring set成为实体上的实际User,而不仅仅是其id?

谢谢


问题答案:

这似乎可以由文档直接回答:

如果您使用@CreatedBy或@LastModifiedBy,则审计基础结构需要以某种方式了解当前主体。为此,我们提供了AuditorAware
SPI接口,您必须实现该接口以告知基础结构与应用程序交互的当前用户系统是谁。通用类型T定义必须使用@CreatedBy或@LastModifiedBy注释的属性的类型。

以下示例显示了使用Spring Security的Authentication对象的接口的实现:

例子104.基于Spring Security的AuditorAware的实现

class SpringSecurityAuditorAware implements AuditorAware<User> {

  public Optional<User> getCurrentAuditor() {

    return Optional.ofNullable(SecurityContextHolder.getContext())
        .map(SecurityContext::getAuthentication)
        .filter(Authentication::isAuthenticated)
        .map(Authentication::getPrincipal)
        .map(User.class::cast);  
  }
}

该实现访问Spring
Security提供的Authentication对象,并查找您在UserDetailsS​​ervice实现中创建的自定义UserDetails实例。我们在这里假设您通过UserDetails实现公开域用户,但是根据找到的身份验证,您还可以从任何地方查找它。



 类似资料:
  • 问题内容: 我正在开发Spring and Stripes网络应用程序的JPA(Hibernate实现)。我有许多JPA实体,它们具有以下共同的字段,用于审计和查询目的: createdBy-创建实体的人的用户ID。createdOn-创建实体的日期更新By-上一次更新实体的用户的用户ID updateOn- 实体上一次更新的日期 我已经使我的应用程序正常工作,以便在实体持久化时会自动设置crea

  • 我使用的是Hibernate4,启用了惰性加载。我有一个包含对其他对象的引用的基本实体。下面是一个简单的例子: 当我从数据库加载Employee实体时,boss对象由一个Hibernate代理对象表示,这是由于延迟加载的原因。稍后我需要访问boss属性,该属性可能在加载它的同一会话中,也可能不在同一会话中。如果我尝试使用boss对象,但它还没有加载,而我处于不同的位置,我将得到以下错误: 我真的想

  • 我正试图使用Spring JDBCTemplate从数据库中获取一条记录。在JdbcTemplate中,我试图通过使用类BeanPropertyRowMapper来自动化数据绑定。我的数据库表列名称类型和模型对象字段名称类型是相同的…我实现了这个API,但我没有得到预期的结果…对于int和double字段,我得到0和0.0值,尽管这些值在数据库中是不同的... 请帮助解决这个问题...我的代码如下

  • 我试图用一个值为0或1的布尔字段来持久化一个条令实体。 当属性设置为true时,它会在数据库中将其另存为“1”。但当其值为“false”或“0”时,它会在数据库中将其另存为NULL。 我如何解决这个问题,只保存为1或0? 我使用的属性的注释如下所示: 当我将nullable设置为false时,我不能坚持它,因为它仍然想要设置为null。 谢谢 当我将其持久化时,字段值为0 尝试1@ORM\列(名称

  • 下面是BeanFactoryPostProcessor的简要功能 BeanFactoryPostProcencer允许您修改实际的bean定义,而不是创建它时的实例。Spring IoC容器将允许BeanFactoryPostProcess读取配置元数据,并可能在容器实际实例化任何bean之前对其进行更改。属性持有人配置是BeanFactoryPostProcess的示例,用于将一些属性值外部化到

  • 我的远程接口是: 我的EJB实现是: 每次当我调用实体方法getFileId()时, 编辑: 当我试图使用JPA2.0提供的方法访问实体的主键时: 我得到了同样的错误回报。烦人??

  • 我使用的是spring boot,因此我没有使用任何xml文件进行配置。我要做的是,在使用MongoRepositories保存数据时,启用OngOAuditing以保存createdDate、lastModifiedDate等。 我的模特课 我使用@CreateDate注释来保存createDate。我对DateTime使用了jodatime依赖项 Spring-data-mongoDB也添加在

  • 在使用JPA更新用户时,如果我尝试使用 JPA首先尝试将关联订单上的userid设置为null,然后删除该行。这将失败,因为userid是不可为空的,并且是主键的一部分。有没有一种方法可以告诉JPA它只需要删除Order行,而不首先将userid列设置为null? 映射:我有的映射是这样的: