Spring Hibernate Mysql:如何获得多对一,多对多,一对多的对象

时间:2016-02-16 07:42:40

标签: mysql spring hibernate

对于多对一,一对多甚至多对多的关系,如何在没有对象包含的情况下获取对象?

说一组地址和一群人,这种关系会是多对多的,如果我只想找一个没有相关地址的“人”怎么办?

Classroom.java

@Entity
public class Classroom {

public Classroom(){
}

public Classroom(long id, String name) {
    this.id = id;
    this.name = name;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

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

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "classroom_people", 
        joinColumns = {@JoinColumn(name = "classroom_id", referencedColumnName = "id") }, 
        inverseJoinColumns = {@JoinColumn(name = "people_id", referencedColumnName = "id") })
private List<People> peoples = new ArrayList<>();

... 
// getter() and setter()

}

People.java

@Entity
public class People{

public People(){
}

public People(long id, String name) {
    this.id = id;
    this.name = name;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private long id;

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

@ManyToMany(mappedBy = "peoples", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Classroom> classrooms = new ArrayList<>();

...
// getter() and setter()

}

通过使用hibernate,自动创建了Classroom,People和连接表classroom_people表。到现在为止,一切都很好。

然后通过使用spring存储库,我尝试通过传递名称来获取人员,并返回一个JSON对象。

我希望得到的只是一个JSON,包括 people.id people.name ,但我得到的是一个JSON,包括一个以及Set中的所有教室,其中包括所有相关的

所以我猜问题是List和List,我应该做的是创建三个表:classroom,people和classroom_people,然后手动存储关系到连接表。然后我可以毫无问题地获取一个简单的对象。

AM我是对的?

enter image description here

enter image description here

enter image description here

enter image description here

我使用Spring Repository和findAllByName(),因此SQL是由spring生成的。只是想知道这是否会成为问题的根源。

1 个答案:

答案 0 :(得分:0)

如果保持双向关系,可以使用HQL轻松完成。 类似的东西:

String hql = "select addr.people from " + Address.class.getName() + " addr where addr.name(or some other attribute) = :addressName"
//set parameter "addressName"

编辑: 现在你采用了一个不同的例子,但上面的查询也适用了相同的例子,例如让人们从课堂上学习。

关于您的最后一个注释,按名称获取People只会获取People个实例,因为@ManyToMany List引用教室是LAZY,这意味着没有填充直到你打电话给people.getClassRooms() (如果你打开会话,它会用另一个查询加载空列表) 您不需要自己创建联结表,而不是为此目的。

您如何知道在获取List<ClassRoom>时填充了People?因为从您的映射看起来没问题,除非您正在调用people.getClassRooms()

相关问题