Java Spring数据,获取行多个一个/一个多个关系?
我正在使用Spring数据进行Spring项目。我有以下型号: Location.javaJava Spring数据,获取行多个一个/一个多个关系?,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我正在使用Spring数据进行Spring项目。我有以下型号: Location.java @Entity @Table(name = "location") @JsonIgnoreProperties(ignoreUnknown = true) public class Location { @Id @GeneratedValue private int id; private String latitude; private String lon
@Entity
@Table(name = "location")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Location {
@Id
@GeneratedValue
private int id;
private String latitude;
private String longitude;
private String date;
@ManyToOne
@JoinColumn(name ="user")
@JsonBackReference
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
...
...
}
@Entity
@Table(name = "users")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
@Id
@GeneratedValue
private int uid;
private String first_name;
private String last_name;
private String email;
private String password;
private boolean enabled;
private String avatar;
@Enumerated(EnumType.STRING)
@Column(name = "user_role")
private Role role;
@OneToMany(mappedBy="user")
@JsonManagedReference
private List<Location> locations;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public List<Location> getLocations() {
return locations;
}
public void setLocations(List<Location> locations) {
this.locations = locations;
}
}
User.java
@Entity
@Table(name = "location")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Location {
@Id
@GeneratedValue
private int id;
private String latitude;
private String longitude;
private String date;
@ManyToOne
@JoinColumn(name ="user")
@JsonBackReference
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
...
...
}
@Entity
@Table(name = "users")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
@Id
@GeneratedValue
private int uid;
private String first_name;
private String last_name;
private String email;
private String password;
private boolean enabled;
private String avatar;
@Enumerated(EnumType.STRING)
@Column(name = "user_role")
private Role role;
@OneToMany(mappedBy="user")
@JsonManagedReference
private List<Location> locations;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public List<Location> getLocations() {
return locations;
}
public void setLocations(List<Location> locations) {
this.locations = locations;
}
}
目标使用crudepository,我想获取所有位置的列表,无论是否有相应的用户
public interface LocationRepository extends CrudRepository<Location, Integer> {
List<Location> findAll();
@Query("SELECT l FROM Location l")
List<Location> findLast();
}
将使用相应的用户获取所有位置
问题:两个查询都获得了相应用户的所有位置强>
我做错了什么?谢谢问题在于您正在映射
位置
,以便始终检索用户
(反之亦然)。如果不希望出现这种行为,可以使用以下方法标记以惰性方式获取用户
:
这样,,
位置
中的用户用户
只有在通过getter访问并且在有效会话内时才会被检索。@NidhalRouissi阅读了我答案的最后一部分:位置
中的用户
只有在通过getter访问并且在有效会话内时才会被检索session.Now获取此异常:org.hibernate.LazyInitializationException:无法初始化代理-没有会话我正在使用Crudepository以尽可能避免手动方法实现,是否有方法决定从何处获取用户对象,或者不只是通过更改查询?@NidhalRouissi如果需要,在会话中检索用户
。通常,会话/事务应该处于服务级别,而不是存储库级别,因此在服务层中,您可以定义是否希望/需要访问所需字段。好的,这是一条要走的路,但是如果始终加载用户对象,那么在JPQL查询中使用JOIN有什么意义?
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name ="user")
@JsonBackReference
private User user;