java - Spring Data one to many mapping -
i try configure onetomany , manytoone mapping in spring data project have issues.
so have 2 entities: employer , project. 1 employer have many projects.
entity classes:
employer.java
@entity @table (name="employer") public class employer { @id @sequencegenerator(name="my_seq", sequencename="global_sequence") @generatedvalue(strategy = generationtype.sequence ,generator="my_seq") @column (name="employer_id") private int id; @column (name="name") private string name; @joincolumn (name="employer_id") @onetomany(mappedby = "employer", cascade = cascadetype.all, fetch = fetchtype.eager) private set<project> project = new hashset<project>(); ...................... }
project.java
@entity @table (name="project") public class project { @id @sequencegenerator(name="my_seq", sequencename="global_sequence") @generatedvalue(strategy = generationtype.sequence ,generator="my_seq") @column (name="project_id") private int id; @column (name="name") private string name; @manytoone @joincolumn(name="employer_id", nullable = false) private employer employer; ...................... }
repository classes:
public interface employerrepository extends jparepository<employer, integer> { } public interface projectrepository extends jparepository<project, integer> { }
services:
@service public class employerserviceimpl implements employerservice { @autowired private employerrepository employerrepository; @override public list<employer> getallemployers() { return employerrepository.findall(); } } @service public class projectserviceimpl implements projectservice { @autowired private projectrepository projectrepository; @override public list<project> getallprojects() { return projectrepository.findall(); } }
controller:
@controller public class maincontroller { private employerservice employerservice; private projectservice projectservice; @autowired(required = true) @qualifier(value = "employerservice") public void setemployerservice(employerservice employerservice) { this.employerservice = employerservice; } @autowired(required = true) @qualifier(value = "projectservice") public void setprojectservice(projectservice projectservice) { this.projectservice = projectservice; } @requestmapping(value="/employers", method=requestmethod.get) public @responsebody list<employer> getemployers(@requestparam(value = "name", required = false) string name) { return employerservice.getallemployers(); } .............................. }
employer table:
employer_id . name ...................... 1 . google 2 . oracle 3 . facebook
project table:
project_id . name . employer_id ....................................... 1 . create web site . 1 2 . create reporting . 2 3 . create web service . 3 4 . fixing web site . 1
i'm expecting this:
[{"id":1,"name":"google","project":[{"id":1,"name":"create web site"}, {"id":4,"name":"fixing web site"}}, {"id":2,"name":"oracle","project":{"id":2,"name":"create reporting"}}, {"id":3,"name":"facebook","project":{"id":3,"name":"create web service"}}]
but getemployers
method controller
class return one:
[{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site", "employer":{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site", "employer":{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site", "employer":{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site", "employer":{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site", "employer":{"id":1,"name":"oracle","project":[{"id":4,"name":"fixing web site","employer": ...................
please sorry if question discussed many times didn't find suitable answer.
thanks in advance!
you have bi-directional association between employer
s , project
s. additionally, have configured both sides of association loaded eager
ly (@manytoone
associations fetched eager
ly default , have forced @onetomany
side fetched eager
ly well). due configuration, when serialization framework loads employer
s, finds valid project
s have back-links employer
s , ends getting stuck in cyclic loop.
in order result want, have mark @manytoone
side (on project
entity) fetched lazy
ly @manytone(fetch = fetchtype.lazy)
.
Comments
Post a Comment