2015-07-01 18 views
7

Spring Data projesinde OneToMany ve ManyToOne eşleme yapılandırmaya çalışıyorum ancak bazı sorunlar var. İşveren ve Proje:Yay Veri bir çok eşleme için

Yani İki varlık vardır. Bir İşveren birçok projeye sahip olabilir.

Varlık sınıfları:

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

Depo sınıfları:

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

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

Hizmetler:

@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(); 
    } 
} 

Denetleyici:

@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();   
    } 
    .............................. 
} 

İşveren tablosu:

EMPLOYER_ID . NAME 
...................... 
1   . Google 
2   . Oracle 
3   . Facebook 

Proje tablosu: Böyle

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

Beklediğim şey:

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

üzgün bu soru defalarca tartışıldı Lütfen ama eğer ben değil mi:

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

Ama getEmployers yöntem controller sınıftan bu bir dönüş uygun bir cevap bulamadı.

Şimdiden teşekkürler!

cevap

4

Employer s ve Project s arasında çift yönlü bir ilişkiniz var. Ayrıca, ilişkilendirmenin her iki tarafını da EAGER yüklenecek şekilde yapılandırdınız (@ManyToOne dernekleri varsayılan olarak EAGER yüklüydü ve öğesinin yanı sıra EAGER öğesinin getirilmesine de zorladım). Bu yapılandırma nedeniyle, serileştirme çerçevesi Employer s yüklendiğinde, Employer s'ye geri bağlantıları olan Project s değerini bulur ve döngüsel bir döngüde takılıp kalkar.

istediğiniz sonucu elde etmek için, @ManyTone(fetch = FetchType.LAZY) olarak ly LAZY getirilecek (Project varlık üzerine) @ManyToOne tarafını işaretlemek zorunda kalacaktır.

+0

Tekrar gösterim için teşekkürler. 'ProjectMadı'na' @ManyToOne (fetch = FetchType.LAZY) 'ekledim ama yardımcı olmadı, sonuç ilkine benzer. – Iurii

+0

Görünüşe göre Jackson, seri halde yüklenen varlıkları seri hale getiriyor. [Bu yazı] (http://stackoverflow.com/questions/25906985/jackson-do-not-serialize-lazy-objects) deneyebileceğiniz bazı seçenekler var. = '@JsonInclude (JsonInclude.Include.NON_EMPTY) @ OneToMany (fetch = FetchType.EAGER, mappedBy = ("işveren"), çağlayan = CascadeType.ALL) özel Seti projesi: – manish

+0

Ben bu benim OneToMany eşlemesi değişti Yeni HashSet (); 'fakat aynı zamanda – Iurii

0

ilişkinin ileri kısmında (yani User.java sınıfı) @JsonManagedReference ekleyin:

@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>(); 

    ... 

ilişkinin arka kısmında (yani Role.java sınıfı) ise @JsonBackReference ekleyin:

@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>(); 

    ... 

Bu benim için çok iyi çalışıyor. :-)

İlgili konular