在Spring Data JPA Repository中填充@Transient字段

3

是否可以通过Spring Data REST api的投影或其他方式填充实体类中的瞬态字段 - 以便在JSON响应中获取该值?我需要为例如info字段填充从第二个数据源获取的值(我有这个数据源的Spring repo bean,并且需要将其注入到类似“拦截器”的东西中并填充该字段)。

@Entity
public class User {
   @Id
   private Long id;

   @Transient
   private String info;

   // getters & setters
}

public interface UserRepository extends JpaRepository<User, Long> {
}

你想如何填充它?瞬态意味着它不会被持久化到数据库中,但该字段仍然可用。 - ricol070
1个回答

1
我发现使用PostLoadEventListener有解决方案,但它是针对Hibernate的,不完全符合我的要求,但可行。我认为应该找到更普遍适用于Spring的解决方案。
@Component
public class UserInterceptor implements PostLoadEventListener {

    @Autowired
    private SecondRepository repo;

    @Autowired
    @Qualifier("prmiaryEntityManagerFactory")
    private EntityManagerFactory entityManagerFactory;

    @PostConstruct
    private void init() {
        HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
        SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
        EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
        registry.appendListeners(EventType.POST_LOAD, this);
    }   

    @Override
    public void onPostLoad(PostLoadEvent event) {
        final Object entity = event.getEntity();
        if(entity != null && entity instanceof User) {
            User user = (User) entity;

            // populate using another repo bean
            Info s = repo.findOne(user.getInfoId());
            user.setInfo(s.getName());
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接