JPA 3-way rejoindre annotation
Il y a trois tables modélisé en trois entités:
@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;
}
Toute seule et unique enregistrement de l'opération-séquence est obtenue par le code SQL qui a un 3-way contrainte de jointure:
SELECT *
FROM event e, process p, operation q
WHERE e.processId = p.id
AND e.datetime = q.datetime
AND p.sequence = q.sequence
À mettre en œuvre que dans la JPA, je dois faire une liste des opérations,
ce qui serait explicitement restreint à un seul enregistrement thro la JQPL l'égalité p.séquence = q.séquence
@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;
}
Où la JPQL spécifie le transitive 3ème contrainte de jointure:
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
WHERE p.sequence = q.sequence
Cependant, je veux que tous les trois contraintes à être modélisé à l'intérieur de l'entité POJO. Ne devrait-il pas être de manière à utiliser les annotations JPA seul à trois voies de la rejoindre? Comme l'entité suivante pseudo-code de l'illustre:
@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;
}
De sorte qu'il ne serait pas nécessaire de spécifier transitif-contrainte de jointure dans la JPQL
SELECT e FROM Event e
INNER JOIN FETCH e.process p
INNER JOIN FETCH e.operations q
Comment modéliser un transitives le rejoindre à l'aide des annotations JPA?
Je ne suis pas sûr à 100% sur ce que votre question est... si vous spécifiez la clause de la joint-t-elle pas à résoudre votre problème?
OriginalL'auteur Blessed Geek | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Vous semblent être en train d'essayer de modéliser une requête, au lieu de vos données. Vous devez modéliser correctement vos données, puis écrivez votre requête.
Vous semblez avoir
Événement
Processus
Opération
À la requête de toutes les opérations pour un événement que vous pourriez utiliser,
Pour obtenir tous les objets de retour d'utilisation,
Si vous avez vraiment besoin de modèle de la requête comme une relation, c'est à l'extérieur de l'APC de spec, mais certains JPA se peut que les fournisseurs de soutien. Dans EclipseLink vous pouvez utiliser un DescriptorCustomizer pour configurer une relation d'utiliser n'importe quelle expression critères, ou que vous possédez SQL.
OriginalL'auteur James
Votre pseudo-mappings sont presque la bonne solution, vous avez juste besoin de groupe de deux
@JoinColumn
s dans un@JoinColumns
:OriginalL'auteur Dragan Bozanovic