我正在使用 spring 和 hibernate 作为我的 java 对象。
我有一个这样的实体:
@Entity
@Table
public class Function implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
/** Code value. */
private String code;
}
另一个引用第一个实体的实体,例如
@Entity
@Table(name = "role", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }), @UniqueConstraint(columnNames = { "code" }) })
public class RoleDef extends CodeLabelEntity{
...some other primitive type...
/** List of functions */
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "role_function",
joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "function_code", referencedColumnName = "code"))
private Set<Function> functions;
}
我正在使用这样的存储库:
public interface RoleDefRepository extends JpaRepository<RoleDef, Long>, QuerydslPredicateExecutor<RoleDef> {
}
当我在我的角色中做时:
roleDefRepository.findAll();
我可以迭代 RoleDef 和函数,因为 EAGER 可以完成这项工作 但是当我尝试这样做时:
RoleDef roleDef = roleDefRepository.findById(id).orElse(null);
我在角色定义中设置的函数是空的。 findById 没有被覆盖,它是像 findAll 这样的默认方法。
如果你看到一些我省略的东西......
我正在使用最新版本的弹簧/休眠
谢谢
我通过在存储库中执行此操作解决了我的问题:
@Query("select r from RoleDef r join fetch r.functions where r.id = ?1")
Optional<RoleDef> findByIdWithFunctionTree(Long id);
但是,如果有人可以找到真正的问题,因为我认为 EAGER 在关系上或通过交易仍然打开时的获取访问将与获取相同......