我正在使用带有JPA注释的Hibernate 4+ Spring MVC + Spring Data:
@Entity
public class ClassOne implements Serializable{
......
@OneToMany(mappedBy = "mapper", fetch=FetchType.LAZY)
private Set<ClassTwo> element = new HashSet<ClassTwo>(0);
//more fields
//getters and setters
//equals and hashcode
}
@Entity
public class ClassTwo implements Serializable{
......
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "CEN_CEN_CODIGO", nullable = false)
private ClassOne classOne;
//more fields
//getters and setters
//equals and hashcode
}
public interface ClassOneRepository extends CrudRepository<ClassOne, Long> {
@Override
@Query("select c from ClassOne c")
public List<ClassOne> findAll();
}
@Service
public class ClassOneService {
@Autowired
private ClassOneRepository classOneRepository;
@Transactional(readOnly=true)
public List<ClassOne> findAll() {
return classOneRepository.findAll();
}
}
最后我从我的@Controller
调用了这个服务@Autowired
ClassOneService classOneService;
我希望结果仅来自ClassOne,但是使用ClassTwo和所有数据库树关联来检索JOIN值。是否可以使用此模式仅获取一个表的值?这是一个缓存问题还是不是为了获取LAZY?
谢谢
答案 0 :(得分:1)
您必须在Set<ClassTwo>
或其吸气剂上方注明以下注释:
@OneToMany(fetch = FetchType.LAZY, ...)
请参阅http://docs.oracle.com/javaee/7/api/javax/persistence/OneToMany.html#fetch()
答案 1 :(得分:0)
似乎是简单的“SELECT *”JPA查询返回实体的所有急切获取的字段。
请参阅:JPA - Force Lazy loading for only a given query 和http://forcedotcom.github.io/java-sdk/jpa-queries。
所以我的解决方案是使用SessionFactory获取当前会话,然后使用“经典”方法
return getCurrentSession().createCriteria(persistentClass).list();
另一种可能的方法是创建一个不带Set的POJO对象,它使用与 ClassOne 相同的表。
答案 2 :(得分:0)
我刚为@ManyToOne和@OneToMany关系添加了@Lazy。看起来Spring Data需要Spring注释,但我认为只需要添加fetch = FetchType.LAZY。没有更多渴望的行为;)。
感谢您的回复