2017-04-24 19 views
1

我有一个问题,如果没有所有子对象关联,我想获取我想要的对象。
我有我的课网站
延迟加载不起作用 - 我只需要父对象,而不是所有的关联

 

    @Entity 
    @Table(name = "Sites") 
    public class Site { 


    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id_Site", unique = true, nullable = false) 
    private long Id_Site; 
    private String ...; 
    private boolean ...; 
    private long ...; 
    private Date ...; 
    private Date ...; 
    private String ...; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set sequences = new HashSet(); 

    @ManyToOne 
    private ... ...; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set ... = new HashSet(); 

    @ManyToOne 
    private ... ...; 

    public constructor... 

    public set.. 
    public get.. 

所以,我只需要站点对象没有序列协会
在我的序列表我有

 



    @Entity 
    @Table(name = "Sequences") 
    public class Sequence { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id_Sequence", unique = true, nullable = false) 
    private long Id_Sequence; 
    private Date ....; 
    private Date ....; 
    private String ....; 
    private String ....; 
    private String ....; 
    private int ....; 
    private int ....; 
    private double ....; 
    private double ....; 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set traceSequences = new HashSet(); 
    @ManyToOne(cascade = CascadeType.ALL) 
    private Site site; 

    public constructor... 

    public set.. 
    public get.. 



,所以,当我使用FetchType.Lazy,并调用我的方法:

 

    @Override 
     public Site findSiteByName(String Name_Site) { 
      List sites = entityManager.createQuery("SELECT s FROM Site s").getResultList(); 
      for (Site item : sites) { 
       if (item.getNom_Site().equals(Name_Site)) { 
        return item; 
       } 
      } 

      return null; 
     }

我得到这个错误:

未能懒洋洋地初始化角色的集合:xxx.xxx.xxx。 xxx.xxx.site.Site.sequences,无法初始化代理 - 没有会话

当我使用FetchType.EAGER,我得到网站的对象,但我也得到所有序列对象,以及其他协会的所有对象(这是正常的我知道)

请,有些人知道为什么懒标注不工作,如何解决这个问题

+0

你是误会。懒加载**是**工作:这就是为什么你得到错误。再后来的一些代码试图访问延迟关联(一个JSON序列为例),它不能被加载,因为没有会话。 –

回答

2

这些懒惰的错误发生时,JPA试图在会议闭幕之后获得的数据。

但是使用eager会影响包含该实体的所有查询。

尝试在查询中使用联合提取而不是渴望。

+0

是的,我同意你的意见。 但是,在查询,而不是急于影响过所有查询连接抓取,只是同样喜欢只用跃跃欲试。 – Adams

0

在代码中的某处,您正在调用Site.GetSequences(),可能是在视图或代码的另一部分中进行迭代。它看起来不像你给出的代码产生异常。

我尝试使用未加载到实体的集合,代码会引发您提到的异常。

为了解决这个问题,找出您在使用sequences并通过更改取到EAGER或使用JOIN在查询中FETCH使用之前加载它们。

+0

谢谢你的帮助,我的评论,可以调用它的所有GetSequences。 不过,我的问题是:如果我使用连接抓取我会得到所有序列的元素,(同样喜欢用渴望),我不需要得到的序列。 我没有得到所有的依赖,我需要站点对象。 – Adams

0

返回一个hibernate管理实体(或者一组hibernate管理实体)很可能会导致这些问题,除非你对于返回的内容以及当会话可用时由hibernate填充的内容超级谨慎。

我会说创建一个DTO(或DTO的集合)和填充它的领域,你喜欢的方式。 DTO转换框架有很多实体,我的最爱是ModelMapper

我也倾向于同意其他与FetchType一起玩的建议,但是由于DTO由我们填充,我们知道我们填充的是什么,而不是基于注释的休眠填充的实体关系。

如果您需要在DTO东西,你只需问实体,因为会议将是可用的时间点,你可以填写你认为你需要在UI上的任何字段。

我不想劫持往DTO和实体这个话题,但是这是我会怎么做。

这可能也有帮助Avoid Jackson serialization on non fetched lazy objects