Hibernate实体上的Spel

时间:2015-02-20 19:33:50

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

我的情况是我有@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变量,然后在需要时插入值。
  4. 现在,它是在第三个上下文中,受到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;      
    }   
    

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

1 个答案:

答案 0 :(得分:2)

由于你使用的是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的注释。