java - JPA Unidrectional OneToMany 通过 JoinColumn 返回相同的记录 n 次而不是 n 个不同的记录

标签 java mysql jpa one-to-many

我们正在尝试在从其他人的应用程序导入的一些只读表上创建 JPA 映射。这些是多个 100 亿行的表,因此无法更改它们的架构。我们有一个表,Message 表,它有一个 OBJECT_ID 值和另一个表,DistributionGroup 表,它将有许多行的 ENTITY_IDs 与任何给定的 OBJECT_ID 相关联。相关表定义如下:

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,而是返回 n 次相同的 DGRecord 值,其中 n 是通过手动运行查询返回的不同行数。我不确定这是否相关,但它实际上在同一对象上循环 n 次(由 System.out.println(dg) 返回相同的 package.DistributionGroup@MemoryAddress n 次证明)。

我们做错了什么,我们该如何解决?请记住,表架构更改或添加连接表的成本如此之高,以至于实际上是不可能的。但在当前设置下,这似乎仍然可以工作,因为它作为人类工作得很好。

最佳答案

我认为你的映射是错误的,

尝试,

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

关于java - JPA Unidrectional OneToMany 通过 JoinColumn 返回相同的记录 n 次而不是 n 个不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271727/

相关文章:

java - 如何限制ListView中的复选框被选中?

java - 如何使用 java 压缩 Lotus Notes (.nsf) 数据库以进行每周备份?

java - 在哪里可以找到编译 servlet 所需的 javax.servlet 类?

mysql - 将 mysql 数据导入 HDFS 时出现异常

python - 将 WRDS SQL 查询保存到 python 中的文件中

java - 是否可以全局更改 varchar 字段 (hbm2ddl) 的默认长度?

java - 错误:表'webproject.user_series_review'不存在org.hibernate.exception.SQLGrammarException:无法提取ResultSet

java - 盖伊/J : unable to register a custom ELResolver

mysql - 如何在输入 $ ps -ef | 后停止 MySQL grep mysql 吗?

java - 更新我的实体时,我的旧实体也会更新