Hibernate简单的一对多查询无限查询
我有以下表格结构:用户、对话框、消息。用户拥有对话框列表和消息列表。对话框包含用户列表和消息列表。消息引用了对话框和用户。所以 用户-对话框:Hibernate简单的一对多查询无限查询,hibernate,jpa,criteria-api,Hibernate,Jpa,Criteria Api,我有以下表格结构:用户、对话框、消息。用户拥有对话框列表和消息列表。对话框包含用户列表和消息列表。消息引用了对话框和用户。所以 用户-对话框:多对多 消息-用户:多对一 消息-对话框多对一 实体: 对话框 我的实体管理器查询 ……等等 我知道我有多个引用,一个实体引用另一个实体,但所有的抓取都是惰性的。你们也可以认为问题出在hashCode、equals或toString方法中,它们并没有对其他实例的任何引用(只有自己的字段) 我不排除我在实体声明中的某个地方弄错了 您可以在您的对话框实体中将J
多对多
消息-用户:多对一
消息-对话框多对一
实体:
对话框
我的实体管理器查询
……等等
我知道我有多个引用,一个实体引用另一个实体,但所有的抓取都是惰性的。你们也可以认为问题出在hashCode、equals或toString方法中,它们并没有对其他实例的任何引用(只有自己的字段)
我不排除我在实体声明中的某个地方弄错了
您可以在您的对话框
实体中将Jackson's与dialogUsers
列表一起使用,这将防止Hibernate在选择对话框
时获取用户列表:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "dialogs_users",
joinColumns = @JoinColumn(name = "id_dialog"),
inverseJoinColumns = @JoinColumn(name = "id_user"))
@JsonIgnore
private List<User> dialogUsers;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“dialogs\u用户”,
joinColumns=@JoinColumn(name=“id\u dialog”),
inverseJoinColumns=@JoinColumn(name=“id\u user”))
@杰索尼奥雷
私人用户名单;
我刚试过。它不会影响我的无限循环,为什么我需要在hibernate知道它是懒惰的并且我没有提到它的时候指定它呢?就像发布堆栈跟踪。。。
@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
}
@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
}
@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();
}
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=?
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "dialogs_users",
joinColumns = @JoinColumn(name = "id_dialog"),
inverseJoinColumns = @JoinColumn(name = "id_user"))
@JsonIgnore
private List<User> dialogUsers;