我的问题可以分解为这个小例子:
我有一个实体类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
}
答案 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)
}