2012-04-22 109 views
2

我们试图在我们从其他人的应用程序导入的某些只读表上创建JPA映射。这些是多个100亿行表,因此更改模式不是一种选择。我们有一个表,具有OBJECT_ID值的Message表和具有另一个表的DistributionGroup表,它们将具有许多与任何给定的OBJECT_ID关联的ENTITY_ID行。有关表定义如下:JPA Unidrectional OneToMany通过JoinColumn返回相同的记录n次而不是n次不同的记录

CREATE TABLE Message (
OBJ_ID varchar(255) NOT NULL, 
FileName varchar(255) NOT NULL, 
KEY FileName (FileName)) ENGINE=InnoDB; 

CREATE TABLE DistributionGroup (
OBJ_ID varchar(255) NOT NULL, 
ENTITY_ID varchar(255) NOT NULL, 
KEY OBJ_ID (OBJ_ID)) ENGINE=InnoDB; 

而且JPA映射链接这两个:

public class MessageRecord { 
    private String obj_id; 
    private String file; 
    private List<DGRecord> list = new ArrayList<DGRecord>(); 

    @Id 
    @Column(name = "OBJ_ID", nullable = false) 
    public String getObjID() { return obj_id; } 
    public void setObjID (String obj_id) { this.obj_id = obj_id; } 
    //... (Similar for FileName) 

    @OneToMany 
    @JoinColumn(name="OBJ_ID", referencedColumnName="OBJ_ID") 
    public List<DGRecord> getDGRecordList() { return list; } 
    public void setDGRecordList(List<DGRecord> list) { this.list = list; } 
} 

public class DGRecord { 
    private String obj_id; 
    private String entity_id; 

    @Id 
    @Column(name = "OBJ_ID", nullable = false) 
    public String getObjID() { return obj_id; } 
    public void setObjID (String obj_id) { this.obj_id = obj_id; } 

    @Column(name = "ENTITY_ID", nullable = false) 
    public String getEntityId() { return entity_id; } 
    public void setEntityId (String entity_id) { this.entity_id = entity_id; } 
} 

现在,当我们运行一些代码来遍历所有的怪位发生对于给定的MessageRecord DGRecords:

MessageRecord record = [obtained earlier]; 
for (DGRecord dg : record.getDGRecordList()) { 
    System.out.println(dg.getEntityId()); 
    //Do some work with the ENTITY_ID 
} 

当我对数据库手动运行该操作中,我得到了我期待看到:

SELECT * FROM DistributionGroup WHERE OBJ_ID = 'ArbitraryObjID'; 
OBJ_ID, ENTITY_ID 
ArbitraryObjID, EntityID1 
ArbitraryObjID, EntityID2 
ArbitraryObjID, EntityID3 

但是从实际的代码的输出,当record具有相同ArbitraryObjID是:

EntityID1 
EntityID1 
EntityID1 

对于任何给定的组合,它没有返回n个不同DGRecords,但同样DGRecord值n次,其中n是手动运行查询返回的不同行的数量。我不确定这是否相关,但它实际上循环了同一个对象n次(由System.out.println(dg)证明返回相同的[email protected] n次)。

我们做错了什么,我们该如何解决?请记住,表格模式更改或添加连接表格的成本太高,以至于无法实现。但是,鉴于目前的设置,它似乎仍然能够工作,因为它与人类一样足够好。

+0

'[较早获得]',是使用一些查询? – 2012-04-22 20:31:35

+0

是的。内置了很多逻辑,但理想情况下,我们查询FileName上的Message表并获得一个结果。或者做一堆工作,让我们最终得到一个有效的MessageRecord。我验证了MessageRecord.getObjID在我描述的情况下与ArbitraryObjID匹配。 – 2012-04-22 20:44:33

回答

0

我觉得你的映射是错误的,

尝试,

@JoinColumn(name="OBJ_ID", referencedColumnName="ENTITY_ID") 
+0

不,我一定希望在MessageRecord的OBJ_ID上使用DistributionGroup的OBJ_ID进行连接。我应该在我的SELECT示例中更清楚一些,但是ArbitraryObjID是一些MessageRecord OBJ_ID。 ENTITY_ID是我们希望通过这种连接检索的独特但未知的值。 – 2012-04-23 16:40:39

+0

那么你的OBJ_ID似乎不是唯一的,在你的手动选择你列出相同的ArbitraryObjID值三次,所以这是同一个对象。如果它不是唯一的,那么还要将getEntityId标记为@Id。 – James 2012-04-24 13:50:42

+0

啊哈! OBJ_ID不唯一,并且ENTITY_ID甚至没有索引。我认为抛弃我的是,没有为表格定义任何主键,也没有任何唯一性保证。我甚至没有意识到可以定义表格而不需要某些列是唯一的,但这不是在这里或那里。这是什么在做这个伎俩。谢谢! – 2012-04-25 16:53:44