Hibernate和JPA总是加载引用的表

时间:2014-07-24 09:30:15

标签: spring hibernate spring-mvc jpa spring-data-jpa

我正在使用带有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?


编辑:我添加了两个班级之间的关系

谢谢

3 个答案:

答案 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 queryhttp://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。没有更多渴望的行为;)。

感谢您的回复