2012-10-02 22 views
9

Hay tres mesas modelados como tres entidades:APP 3 vías unirse a la anotación

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

Cualquier registro único single del proceso de operación de secuencia se obtiene mediante el SQL que tiene una restricción de 3 vías unirse a:

SELECT * 
FROM event e, process p, operation q 
WHERE e.processId = p.id 
    AND e.datetime = q.datetime 
    AND p.sequence = q.sequence 

para poner en práctica que, en JPA, tengo que hacer una lista de las operaciones, que se redujo de forma expresa a un único registro excelentes referencias del p.sequence igualdad 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; 
} 

Cuando el JPQL especifica la tercera transitiva se unen restricción:

SELECT e FROM Event e 
INNER JOIN FETCH e.process p 
INNER JOIN FETCH e.operations q 
WHERE p.sequence = q.sequence 

Sin embargo, quiero que las tres limitaciones a ser modelados dentro de la entidad POJO. ¿No debería haber forma de utilizar solo las anotaciones JPA para unir en tres? A medida que la entidad pseudocódigo siguiente ilustra:

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

Así que no sería necesario especificar transitiva unirse a la restricción en el JPQL

SELECT e FROM Event e 
INNER JOIN FETCH e.process p 
INNER JOIN FETCH e.operations q 

¿Cómo modelar una transitiva Registro mediante anotaciones JPA?

+0

Por cierto, me han dejado fuera las anotaciones JAXB. Event debe ser absolutamente la etiqueta raíz XML. Por lo tanto, la entidad que se está modelando utiliza el evento POJO. La entidad Evento se usa directamente como XML DTO thro JAXB. Es decir, no debe sugerir que use otro POJO como raíz. –

+0

No estoy 100% seguro de cuál es su problema ... si especifica la cláusula ON de las uniones, ¿no resuelve su problema? – slambeth

Respuesta

2

Parece que está intentando modelar una consulta, en lugar de sus datos. Debe modelar sus datos correctamente y luego escribir su consulta.

Parece tener

Evento

  • proceso
  • ManyToOne (processId)

Proceso

  • eventos - OneToMany
  • operaciones - OneToMany

Operación

  • proceso - ManyToOne (secuencia) (éste es un poco extraño, como secuencia no es el Id, esto está fuera de la especificación JPA, pero algunos JPA proveedor puede apoyarlo)

para consultar todas las operaciones para un evento, se puede usar,

Select o from Operation o join o.process p join p.events e where e.datetime = o.datetime 

para conseguir todos los objetos de regreso utilizar,

Select o, p, e from Operation o join o.process p join p.events e where e.datetime = o.datetime 

Si realmente necesita para modelar la consulta como una relación, esto está fuera de la especificación JPA, pero algunos proveedores JPA puede apoyarlo. En EclipseLink puede usar un DescriptorCustomizer para configurar cualquier relación para usar cualquier criterio de expresión, o si posee SQL.

+4

Por favor acepte mis disculpas, pero ¿podría reestructurar su respuesta para responder mi pregunta en lugar de aconsejarme cómo limpiar mi vida de escombros que la gente me arroja? Gracias. –

1

Sus pseudo-asignaciones son casi la solución correcta, sólo tiene que agrupar dos @JoinColumn s en un @JoinColumns:

@OneToOne 
@JoinColumns({ 
    @JoinColumn(
    name = "datetime", referencedColumnName="datetime", 
    insertable=false, updatable=false), 
    @JoinColumn(
    name = "sequence", referencedColumnName="sequence", 
    insertable=false, updatable=false) 
}) 
private Operation operations;