2015-07-01 15 views
7

करने के लिए डेटा एक मैं OneToMany और ManyToOne कॉन्फ़िगर में स्प्रिंग डेटा प्रोजेक्ट मानचित्रण लेकिन कुछ मुद्दे हैं की कोशिश करो।स्प्रिंग कई मानचित्रण

तो मेरे पास दो इकाइयां हैं: नियोक्ता और परियोजना। एक नियोक्ता के पास कई परियोजनाएं हो सकती हैं।

इकाई वर्गों:

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; 
    ...................... 
} 

भंडार कक्षाएं:

public interface EmployerRepository extends JpaRepository<Employer, Integer> { 
} 

public interface ProjectRepository extends JpaRepository<Project, Integer> { 
} 

सेवाएं:

@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 
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_ID . NAME 
...................... 
1   . Google 
2   . Oracle 
3   . Facebook 

परियोजना तालिका: कुछ इस तरह

PROJECT_ID . NAME   . EMPLOYER_ID 
....................................... 
1   . Create web site . 1 
2   . Create reporting . 2 
3   . Create web service . 3 
4   . Fixing web site . 1   

मैं उम्मीद कर रहा हूँ: controller वर्ग से

[{"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"}}] 

लेकिन getEmployers विधि लौट इस एक:

[{"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": 
................... 

कृपया खेद इस सवाल कई बार चर्चा की, लेकिन मैं नहीं था, तो कोई उपयुक्त उत्तर नहीं मिला।

अग्रिम धन्यवाद!

उत्तर

4

आपके पास Employer एस और Project एस के बीच एक द्वि-दिशात्मक संबंध है। इसके अतिरिक्त, आपने EAGER ly लोड करने के लिए एसोसिएशन के दोनों पक्षों को कॉन्फ़िगर किया है (@ManyToOne एसोसिएशन EAGER लाइफ डिफ़ॉल्ट रूप से लाए जाते हैं और आपने पक्ष को EAGER लाइफ भी लाया है)। इस कॉन्फ़िगरेशन के कारण, जब क्रमबद्धता फ्रेमवर्क Employer एस लोड करता है, तो यह Project एस मान्य होता है जिसमें Employer एस के बैक-लिंक होते हैं और चक्रीय पाश में फंस जाते हैं।

आदेश परिणाम आप चाहते हैं पाने के लिए, आप (Project इकाई पर) @ManyToOne पक्ष को चिह्नित करने के @ManyTone(fetch = FetchType.LAZY) के रूप में ly LAZY दिलवाया करना होगा।

+0

रीप्ले के लिए धन्यवाद। मैं '@ManyToOne (fetch = FetchType.LAZY) 'को' प्रोजेक्ट 'इकाई में जोड़ता हूं लेकिन इससे मदद नहीं मिलती है, परिणाम पहले जैसा ही होता है। – Iurii

+0

ऐसा लगता है कि जैक्सन आलसी-भारित इकाइयों को क्रमबद्ध करने के लिए समाप्त होता है। [यह पोस्ट] (http://stackoverflow.com/questions/25906985/jackson-do-not-serialize-lazy-objects) में कुछ विकल्प हैं जिन्हें आप आजमा सकते हैं। – manish

+0

मैं इस एक के लिए मेरी OneToMany मानचित्रण बदल दिया है: '@JsonInclude (JsonInclude.Include.NON_EMPTY) @OneToMany (लाने = FetchType.EAGER, mappedBy = (" नियोक्ता "), झरना = CascadeType.ALL) निजी सेट परियोजना = नया हैशसेट (); 'लेकिन यह – Iurii

0

रिश्ते की आगे भाग में (यानी User.java वर्ग) @JsonManagedReference जोड़ें:

@Entity 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 

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

    @ManyToMany 
    @JoinTable(name="users_roles",[email protected](name = "user_fk"), [email protected](name = "role_fk")) 
    @JsonManagedReference 
    private Set<Role> roles = new HashSet<Role>(); 

    ... 

संबंध के पीछे भाग (यानी Role.java वर्ग) में @JsonBackReference जोड़ें:

@Entity 
public class Role implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @ManyToMany(mappedBy="roles") 
    @JsonBackReference 
    private Set<User> users = new HashSet<User>(); 

    ... 

यह मेरे लिए बहुत अच्छा काम करता है। :-)

संबंधित मुद्दे