2017-03-06 34 views
0

奖实体Hibernate的多对多映射无限DB调用

@JsonIgnore 
@ManyToMany(mappedBy="awards", fetch=FetchType.LAZY) 
private Set<Winner> winners = new HashSet<>(); 

得主实体

@ManyToMany(fetch=FetchType.LAZY) 
@JoinTable(name="AWARD_ASSIGNMENT", 
joinColumns={@JoinColumn(name="WINNER_ID", referencedColumnName="ID")}, 
inverseJoinColumns={@JoinColumn(name="AWARD_ID", referencedColumnName="ID")}) 
private Set<Award> awards = new HashSet<>(); 

我打电话这种休眠获取方法

return getSession().createQuery("from Winner").list(); 

Hashcode方法等于在颁奖实体方法重载

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + (int) (id^(id >>> 32)); 
     result = prime * result + ((winners == null) ? 0 : winners.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Award other = (Award) obj; 
     if (id != other.id) 
      return false; 
     if (winners == null) { 
      if (other.winners != null) 
       return false; 
     } else if (!winners.equals(other.winners)) 
      return false; 
     return true; 
    } 

得主实体

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((awards == null) ? 0 : awards.hashCode()); 
     result = prime * result + (int) (id^(id >>> 32)); 
     return result; 
    } 


    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Winner other = (Winner) obj; 
     if (awards == null) { 
      if (other.awards != null) 
       return false; 
     } else if (!awards.equals(other.awards)) 
      return false; 
     if (id != other.id) 
      return false; 
     return true; 
    } 

重写equals和hashCode方法为多对多关系,使用SET。

+0

Do Award和Winner有equals/hashCode方法吗?如果是的话请添加impl –

+0

我已经添加了hashcode和equals方法,但是我仍然看到无限调用 – alowsarwar

+0

我的意思是..将它们添加到您的帖子中让我们看到 –

回答

0

要记住的要点:

1)确保不会有协会(一个在你的哈希码或等于方法很多/多对多..等)。而重写hashcode/equals方法使用使该对象唯一的字段(例如FirstName + LastName + Phone number)尝试避免使用由JPA生成的PK Id。

2)限制Jackson/Json序列化以避免深度遍历。

@JsonManagedReference 
private Set<Award> awards = new HashSet<>(); 

@JsonBackReference 
private Set<Winner> winners = new HashSet<>();