Ci sono tre tabelle modellati come tre entità:JPA 3 vie aderire annotazione
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
}
@Entity
@Table(name="process")
public class Process {
public Long Id;
public Long sequence;
public Name name;
}
@Entity
@Table(name="operation")
public class Operation {
public Long Id;
public Long datetime;
public Long sequence;
}
Qualunque singolo record unico processo funzionamento sequenza si ottiene l'SQL che ha un vincolo a 3 vie join:
SELECT *
FROM event e, process p, operation q
WHERE e.processId = p.id
AND e.datetime = q.datetime
AND p.sequence = q.sequence
di attuare tale in APP, devo fare un elenco di operazioni, che sarebbe esplicitamente ridotta a un singolo record thro il p.sequence uguaglianza JQPL = q.sequence
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
@OneToOne
@JoinColumn(
name = "processId", referencedColumnName="id",
insertable=false, updatable=false)
private Process process;
@OneToMany
@JoinColumn(
name = "datetime", referencedColumnName="datetime",
insertable=false, updatable=false)
private List<Operation> operations;
}
Qualora il JPQL specifica il 3 ° transitiva join vincolo:
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
WHERE p.sequence = q.sequence
Tuttavia, voglio tutti i tre vincoli di essere modellati all'interno dell'entità POJO. Non dovrebbe esserci modo di utilizzare le annotazioni JPA da solo a un join a tre vie? Come le seguenti entità pseudo-codice illustra:
@Entity
@Table(name="event")
public class Event {
public Long datetime;
public String name;
public Long processId;
@OneToOne
@JoinColumn(
name = "processId", referencedColumnName="id",
insertable=false, updatable=false)
private Process process;
@OneToOne
@JoinColumn(
name = "datetime", referencedColumnName="datetime",
insertable=false, updatable=false)
@JoinColumn(
name = "process.sequence", referencedColumnName="sequence",
insertable=false, updatable=false)
private Operation operations;
}
in modo che non sarebbe stato necessario specificare transitiva-join vincolo nel JPQL
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
Come faccio a modello di un transitiva join utilizzando le annotazioni JPA?
BTW, ho lasciato fuori le annotazioni JAXB. L'evento deve assolutamente essere il tag radice XML. Pertanto, l'entità viene modellata utilizzando il POJO evento. L'entità Event viene utilizzata direttamente come XML DTO tramite JAXB. Vale a dire, non dovresti suggerire di utilizzare un altro POJO come root. –
Non sono sicuro al 100% su quale sia il problema ... se si specifica la clausola ON dei join, non risolve il problema? – slambeth