2015-10-11 9 views
7

Ho due entità, società e lavoro, con una relazione bidirezionale OneToMany. Il mio problema è che non posso caricare pigro l'azienda List<Job> jobs.Spring Data Rest JPA - Impossibile caricare pigro OneToMany relazione bidirezionale

Per esempio quando faccio:

GET /api/companies/1 questa è la risposta JSON:

{ 
    "id": 1, 
    "name": "foo", 
    ... 
    "_embedded": { 
    "jobs": [ 
     {...}, 
     ... 
     {...} 
    ], 
    "employees": [ 
     {...}, 
     {...} 
    ] 
    }, 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/api/companies/1" 
    }, 
    "jobs": { 
     "href": "http://localhost:8080/api/companies/1/jobs" 
    }, 
    "employees": { 
     "href": "http://localhost:8080/api/companies/1/employees" 
    } 
    } 
} 

io non voglio avere il _embedded dato che non ho impostato il fetchType = EAGER. Qui sono i miei modelli:

Company.java

@Entity 
public class Company { 

    @Column(nullable = false, unique = true) 
    private String name; 


    @OneToMany(mappedBy = "company", fetch = FetchType.LAZY) 
    private List<Job> jobs; 

    ... 

    public Company() { 
    } 

    ... 

} 

Job.java

@Entity 
public class Job { 

    @Column(nullable = false) 
    public String title; 

    @Column(length = 10000) 
    public String description; 

    @ManyToOne(fetch=FetchType.LAZY) 
    private Company company; 

    ... 

    public Job() { 
    } 

    ... 

} 

Come si può vedere la stessa cosa accade per le altre relazioni OneToMany (dipendenti). Posso evitare di restituire l'intero elenco di offerte di lavoro o dipendenti ogni volta?

MODIFICA: dal lato Lavoro il carico pigro funziona bene! Non ricevo la risposta della società che è correlata a un lavoro. Devo fare esplicitamente /api/jobs/123/company per ottenere la compagnia.

MODIFICA 2: le proiezioni funzionano solo per le raccolte. In questo caso non è ciò di cui ho bisogno. Gli estratti potrebbero funzionare, ma voglio evitarli. Non voglio fare l'esplicitazione /api/companies/1?projection=MyProjection dato che non ne uso più di uno. Voglio cambiare il comportamento predefinito, proprio come fanno le proiezioni nelle raccolte.

Edit3: ho provato questo

@RestResource(exported = false) 
@OneToMany(mappedBy = "company") 
private List<Job> jobs; 

e ottengo l'errore Detected multiple association links with same relation type! Disambiguate association.

è davvero fastidioso. Ho solo bisogno di liberarmi di _embedded. Nulla?

+0

Questa non è una vera domanda su JPA, è una domanda sul fatto che le raccolte all'interno di "Azienda" debbano essere serializzate. Sarebbe lo stesso problema se la relazione fosse solo POJO non mappata su oggetti persistenti. – wrschneider

+1

In questo caso un '@RestResource (exported = false)' o '@ JsonIgnore' nel campo' jobs' dovrebbe essere sufficiente (si veda [qui] (http://docs.spring.io/spring-data/rest/docs /current/reference/html/#customizing-sdr.hiding-repositories)). –

+0

@DavidRiccitelli ma ho bisogno che vengano esportati. Ho solo bisogno di caricarli pigro, quindi avrò i lavori di una società solo quando faccio '/ api/companies/1/jobs'. –

risposta

0

È possibile utilizzare i grafici Entity Graph.Entity vengono utilizzati per ignorare in fase di esecuzione le impostazioni del dell'attributo mappings.For esempio

@Repository 
public interface GroupRepository extends CrudRepository<GroupInfo, String> { 

    @EntityGraph(attributePaths = { "members" }) 
    GroupInfo getByGroupName(String name); 

} 

prendere Dalla primavera dati Jpa Documentazione "4.3.10. Configurazione Fetch- e LoadGraphs " https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

Inoltre; enter image description here