Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于内部连接导致hibernate中的重复结果:如何解决?_Hibernate_Spring Data Jpa - Fatal编程技术网

由于内部连接导致hibernate中的重复结果:如何解决?

由于内部连接导致hibernate中的重复结果:如何解决?,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我有这张桌子: TABLE1 ID PRIMARY KEY FIELD1 TABLE2 T1_ID REFERENCES TABLE1(ID), FIELD1, PRIMARY KEY(T1_ID, FIELD1) 下表: TABLE1 ID PRIMARY KEY FIELD1 TABLE2 T1_ID REFERENCES TABLE1(ID), FIELD1, PRIMARY KEY(T1_ID, FIELD1) 因此,第一个表的主键是第二个表的主键的一部分(也是一个外部引用) 我

我有这张桌子:

TABLE1
ID PRIMARY KEY
FIELD1
TABLE2
T1_ID REFERENCES TABLE1(ID),
FIELD1,
PRIMARY KEY(T1_ID, FIELD1)
下表:

TABLE1
ID PRIMARY KEY
FIELD1
TABLE2
T1_ID REFERENCES TABLE1(ID),
FIELD1,
PRIMARY KEY(T1_ID, FIELD1)
因此,第一个表的主键是第二个表的主键的一部分(也是一个外部引用)

我在hibernate中尝试过这样建模:

@Entity
@Data
public class Table1 {

    @Id
    @Column("ID")
    private Long id; //easy!

    @OneToMany(mappedBy = "table2", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    private List<Table2> references;
 }
然后我用它:

@Entity
@Data
public class Table2 {

@EmbeddedId
private Table2Key id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "T1_ID", insertable = false, updatable = false)
@ToString.Exclude
private Table1 table1;
出于某种原因,当我想要获取我得到的第一个实体的元素时:

select * from TABLE1 t1
 inner join TABLE2 t2 on t1.ID=t2.T1_ID
这将导致T1类型的重复实体列表! 我做错了什么

编辑
根据一些建议,我尝试将列表更改为一组:

@OneToMany(mappedBy = "table2", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private Set<Table2> references;
  • 除了Id类型
    Long
    String
    被错误地映射到
    Table2Key
    之外,我在您的原始帖子中没有看到任何问题。应该是
  • 如果仍然存在问题,并且如果您手动将数据插入应用程序,我将删除所有数据,并通过
    spring-data-jpa
    repository方法存储数据

  • 正如我提到的,数据库中的数据不正确。下面是一个与您的实体完全相同的示例应用程序。它插入数据,然后执行“全部查找”,不包含任何重复项


如果答案没有帮助,那么在你的问题中添加表中的数据是值得的。数据是一样的,我逐字段检查……我变得疯狂了。您是否可以删除数据并通过repo保存。我假设您是手动插入数据的?不,它属于现有的数据库,我不能这样做。请看一个没有任何问题的示例repo,并发出正确的查询
    @Embeddable
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class Table2Key {

      @Column(name= "T1_ID")
      private Long t1Id;

      @Column(name = "FIELD1")
      private String field1;

    }