【问题标题】:SpEL on Hibernate Entity休眠实体上的 SpEL
【发布时间】:2015-04-22 14:15:08
【问题描述】:

我有如下@ManyToOne 关系的情况,

public class PersonEntity implements Serializable {
  @Id
  @Column(...)
  private String personID;

  @Basic
  @Column(...)
  private String parentID;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity=PersonEntity.class)
  @JoinColumn(name = "personID")
  @Fetch(FetchMode.SELECT)
  private PersonEntity parentPerson;      
}

正如你在上面看到的,我有一个人,他的父母也是一个人。现在,在 99% 的业务场景中,我只需要父级的名称。因此,访问整个父对象是一种矫枉过正。

所以,为了克服这个问题,有三种可能的解决方案:

  1. 修改数据库表并将父名称添加到表本身。
  2. 创建一个视图来完成与上述相同的工作。
  3. 创建一个人名的@Transient 变量,然后在需要时插入该值。

现在,在第三种情况下,受 Spring @Projection (Spring DATA REST) 的启发,我想用 SpEL 尝试如下所示的东西。但是,它似乎不起作用。

public class PersonEntity implements Serializable {
  @Id
  @Column(...)
  private String personID;

  @Basic
  @Column(...)
  private String parentID;

  @Transient
  @Value("#{@parentRepository.findOne(target.getParentID()).getParentName()}")
  private String parentName;      
}   

有人可以帮助我理解为什么这不起作用吗?除了上面列出的,还有其他选择吗?

【问题讨论】:

  • @Value(和 SpEL)在 Spring 应用程序容器的上下文中是有意义的,而实体由 JPA 持久性提供程序管理(在这种情况下为休眠)。因此,使用 Spring 注解对实体进行注解是没有意义的。
  • 我认为这取决于上下文..一天结束...他们都必须共同努力以实现某些业务目标..在我的情况下,数据可以通过 Spring Data 访问REST 组件或常规 Spring 组件(如 @Service 等),我想确保代码不会重复自身。
  • 如上所述,您的实体不是 Spring 托管的 bean,Spring 对此一无所知。
  • 嗨艾伦..对不起,如果这听起来很傻..只是想在这里理解这个概念..因为 Spring 容器将负责响应过程..为什么不调用我的 SpEL?

标签: java spring hibernate spring-data spring-data-rest


【解决方案1】:

由于您使用的是 Hibernate,因此您可以这样做:

public class PersonEntity implements Serializable {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parentID")
  @Fetch(FetchMode.SELECT)
  private PersonEntity parent;

  @Basic(fetch = FetchType.LAZY)
  @Formula("select p.name from person p where p.id = parentID")
  private String parentName;
}

注意Formula 是特定于 Hibernate 的注解。

【讨论】:

  • 嗨 Manish.. 我实际上试过这个.. 这个配置会抛出这样的错误.. 原因是:org.hibernate.AnnotationException: "@OneToOne or @ManyToOne on com.tb.ao.domain .entity.PersonEntity.parentName 引用了一个未知实体:java.lang.String"}}
  • 我已将您的课程添加到a sample application of mine。有an associated test case。没有看到错误。您可以将您的代码与此进行比较吗?
  • 抱歉之前的评论..我理解我的错误..我需要使用@Basic!感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2018-10-24
相关资源
最近更新 更多