2017-07-10 5 views
1

Ich habe Tabellen Struktur folgende: Benutzer, Dialog, Nachricht. Benutzer hat eine Liste von Dialogen und eine Liste von Nachrichten. Dialog hat eine Liste von Benutzern und eine Liste von Nachrichten. Und Nachricht verweist auf Dialog und Benutzer. SoHibernate einfach eine zu viele Abfrage unendlich Abfragen

Benutzer - Dialog: many to many,

Nachricht - Benutzer: many to one,

Nachricht - Dialog many to one

Instanzen:

Dialog

@Entity 
@Table(name = "dialogs") 
public class Dialog { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_dialog") 
    private Long id; 

    @Column(name = "dialog_name") 
    private String dialogName; 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "dialogs_users", 
      joinColumns = @JoinColumn(name = "id_dialog"), 
      inverseJoinColumns = @JoinColumn(name = "id_user")) 
    private List<User> dialogUsers; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "dialog") 
    private List<Message> messages = new ArrayList<>(); 

    //default constructor and getters setters and hashCode equals toString 
} 

Benutzer

@Entity 
@Table(name = "users") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_user") 
    private Long id; 

    @NotNull 
    @Column(name = "full_name") 
    private String fullName; 

    @NotNull 
    @Column(name = "email") 
    private String email; 

    @NotNull 
    @Column(name = "active") 
    private boolean active; 

    @NotNull 
    @Column(name = "password") 
    private String password; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") 
    private List<Message> messages; 

    @ElementCollection(targetClass = Role.class) 
    @CollectionTable(name = "user_roles", 
      joinColumns = @JoinColumn(name = "user")) 
    @Column(name = "role") 
    @Enumerated(EnumType.ORDINAL) 
    private List<Role> roles = new ArrayList<>(); 

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "dialogUsers") 
    private List<Dialog> dialogs = new ArrayList<>(); 

    //default constructor and getters setters and hashCode equals toString 
} 

Nachricht

@Entity 
@Table(name = "messages") 
public class Message { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_message") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_dialog") 
    private Dialog dialog; 

    @Column(name = "value") 
    private String value; 

    @Column(name = "date_time") 
    private LocalDateTime dateTime; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_user") 
    private User user; 

    //default constructor and getters setters and hashCode equals toString 
} 

Meine EntityManager Abfrage

@Override 
public List<Message> findMessagesByDialog(Long dialogId) { 
    CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Message> criteria = builder.createQuery(Message.class); 
    Root<Dialog> dialog = criteria.from(Dialog.class); 

    Join<Dialog, Message> messages = dialog.join(Dialog_.messages); 

    criteria.select(messages).where(builder.equal(dialog.get(Dialog_.id), dialogId)); 
    return entityManager.createQuery(criteria).getResultList(); 
} 

Stapel Spur ich immer bin, wenn ich diese Abfrage

Hibernate: 
    select 
     messages1_.id_message as id_messa1_2_, 
     messages1_.date_time as date_tim2_2_, 
     messages1_.id_dialog as id_dialo4_2_, 
     messages1_.id_user as id_user5_2_, 
     messages1_.value as value3_2_ 
    from 
     dialogs dialog0_ 
    inner join 
     messages messages1_ 
      on dialog0_.id_dialog=messages1_.id_dialog 
    where 
     dialog0_.id_dialog=1 
Hibernate: 
    select 
     dialog0_.id_dialog as id_dialo1_0_0_, 
     dialog0_.dialog_name as dialog_n2_0_0_ 
    from 
     dialogs dialog0_ 
    where 
     dialog0_.id_dialog=? 
Hibernate: 
    select 
     user0_.id_user as id_user1_4_0_, 
     user0_.active as active2_4_0_, 
     user0_.email as email3_4_0_, 
     user0_.full_name as full_nam4_4_0_, 
     user0_.password as password5_4_0_ 
    from 
     users user0_ 
    where 
     user0_.id_user=? 
Hibernate: 
    select 
     user0_.id_user as id_user1_4_0_, 
     user0_.active as active2_4_0_, 
     user0_.email as email3_4_0_, 
     user0_.full_name as full_nam4_4_0_, 
     user0_.password as password5_4_0_ 
    from 
     users user0_ 
    where 
     user0_.id_user=? 
Hibernate: 
    select 
     dialoguser0_.id_dialog as id_dialo1_1_0_, 
     dialoguser0_.id_user as id_user2_1_0_, 
     user1_.id_user as id_user1_4_1_, 
     user1_.active as active2_4_1_, 
     user1_.email as email3_4_1_, 
     user1_.full_name as full_nam4_4_1_, 
     user1_.password as password5_4_1_ 
    from 
     dialogs_users dialoguser0_ 
    inner join 
     users user1_ 
      on dialoguser0_.id_user=user1_.id_user 
    where 
     dialoguser0_.id_dialog=? 

ausführen ..und so weiter

Ich weiß, dass ich multireferences und eine Entitätsverweis andere haben aber alle Abholungen sind faul . Und auch Sie können denken, dass das Problem in den Methoden hashCode, equals oder toString ist, sie haben keinen Bezug zu anderen Instanzen (nur eigene Felder).

Ich schließe nicht aus, dass ich falsch irgendwo in meinen Entity-Deklarationen

+0

Vorsicht zu erwähnen, was ist die "Endlosschleife"? wie den Stack-Trace ... –

Antwort

0

habe, können Sie Jackson verwenden @JsonIgnore annotation mit dialogUsers Liste in Ihrer Dialog Einheit, wird es Hibernate von Abrufen der Liste fo Benutzer verhindern Bei der Auswahl einer :

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "dialogs_users", 
     joinColumns = @JoinColumn(name = "id_dialog"), 
     inverseJoinColumns = @JoinColumn(name = "id_user")) 
@JsonIgnore 
private List<User> dialogUsers; 
+0

Ich habe es gerade versucht. Es hat keinen Einfluss auf meine Endlosschleife, und warum muss ich es angeben, wenn Hibernate weiß, dass es faul ist und ich nicht darauf verweise –