我们试图在我们从其他人的应用程序导入的某些只读表上创建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次)。
我们做错了什么,我们该如何解决?请记住,表格模式更改或添加连接表格的成本太高,以至于无法实现。但是,鉴于目前的设置,它似乎仍然能够工作,因为它与人类一样足够好。
'[较早获得]',是使用一些查询? – 2012-04-22 20:31:35
是的。内置了很多逻辑,但理想情况下,我们查询FileName上的Message表并获得一个结果。或者做一堆工作,让我们最终得到一个有效的MessageRecord。我验证了MessageRecord.getObjID在我描述的情况下与ArbitraryObjID匹配。 – 2012-04-22 20:44:33