春天JPA OneToOne出自OneToMany只有第一个条目

时间:2016-08-31 13:25:13

标签: spring jpa

我的问题可以分解为这个小例子:
我有一个实体类A和一个实体类B.A有一个B对象列表。现在总有一个B相关。所以我不想加载A的所有B,只是为了访问这个B(最后在A中插入B)。
问题:我可以在没有服务的情况下操纵实体,因此有一个@Transient变量,它始终是最新的B吗?并且还没有在A中单独保存最新的B。有没有办法实现这一目标?

class B{
    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable=false)
    private String name;

    @Column(nullable=false)
    private Date created = new Date();
}

class A{
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany
    @OrderBy("created ASC")
    private List<B> b;

    @Transient
    private B newestB; // Here should be only the newest B
}

1 个答案:

答案 0 :(得分:0)

是。忘记将最新的B存储为变量,而只需为其添加一个getter:

@Transient
public B getNewestB() {
  return b.get(b.size() -1);
}

这将在假设b设置为FetchType.EAGER的情况下解决您的问题。使用b的getter和FetchType.LAZY获取可能不是那么直接,因为Spring可能依赖于AOP代理调用来触发延迟加载(您需要进行实验)。

但是,我不鼓励这两种方法。您正在有效地尝试将业务逻辑融入您的实体。为什么不保持您的实体干净并使用B的存储库执行此查询?

E.g。

public interface BRepository extends CrudRepository<B, Long> {
  @Query(...)  //query to get newest B for specified A
  B getNewest(A a)
}