2012-10-02 65 views
9

有建模为三个实体三个表:JPA 3路连接注释

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

流程操作序列的任何独特的单记录由具有3路连接限制的SQL获得:

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

为了实现在JPA,我必须做出操作的列表, 这将是明确的范围缩小到救援人员到场的JQPL平等p.sequence一个记录= 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; 
} 

凡JPQL指定传递第三个加入约束:

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

不过,我想所有的三个约束的实体POJO内进行建模。难道不应该有办法单独使用JPA注释来进行三向连接吗?如下面的实体的伪代码说明:在JPQL

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

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

因此,它没有必要指定传递联接约束如何使用JPA注释连接模型的传递?

+0

BTW,我已经离开了JAXB注释。事件必须绝对是XML根标签。因此,使用事件POJO对实体进行建模。 Event实体直接用作XML DTO和JAXB。也就是说,你不应该建议我使用另一个POJO作为根。 –

+0

我不是100%确定你的问题是什么......如果你指定了连接的ON子句,它不能解决你的问题吗? – slambeth

回答

2

您似乎试图建模查询,而不是您的数据。你应该正确地建模你的数据,然后编写你的查询。

你似乎有

事件

  • 过程
  • 多对一(的ProcessID)

过程

  • 事件 - 一对多
  • 操作 - 一对多

操作

  • 过程 - 多对一(序列)(这个人是有点古怪,因为序列是不是ID,这是JPA规范之外,但有些JPA供应商可能会支持它)

要查询的所有操作的事件,你可以使用,

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

为了让所有的对象返回使用,

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

如果你真的需要查询的关系模型,这是JPA规范之外,但有些JPA提供商可能支持它。在EclipseLink中,您可以使用DescriptorCustomizer将任何关系配置为使用任何表达式条件,或者您拥有SQL。

+4

请接受我的道歉 - 但是,您能否重新调整您的答案来回答我的问题,而不是告诉我如何清除我的生活中的垃圾碎片?谢谢。 –

1

你的伪映射几乎是正确的解决方案,你只需要两个@JoinColumn的研究小组在@JoinColumns

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