java Hibernate不检索多对多关系

vwoqyblh  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(250)

我有2个多对多关系的表,所有表都是使用外部脚本在PostgreSQL中创建的。我很难在我的数据模型对象中获得完整的数据。我使用的是Lombok,我的实体类看起来与此类似

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TableA")
class TableA {
    @Id
    private int aId;
    private String aValue;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "TableAB",
        JoinColumns = {@JoinColumn(name="TableAId")},
        inverseJoinColumns = {@JoinColumn(name="TableBId")})
    private Set<TableB> tableBs = new HashSet<>();
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TableB")
class TableB {
    @Id
    private int bId;
    private String bValue;
    @ManyToMany(mappedBy = "tableBs")
    private Set<TableA> tableAs;
}

当我跑步时:

session.createQuery("FROM TableA a JOIN FETCH a.TableBs", TableA.class).list()

我得到了一个TableA对象的列表,但是这些对象中的tableBs是一个空的Set。我打开了hibernate SQL,我可以看到一个将TableAB连接到TableB的查询,如果我在Intellij数据库控制台中运行该查询,它将返回预期的结果。
我还尝试在解析TableAs的调试器中返回所有具有类似查询的TableB对象,但当不调试或在Docker容器中运行应用程序时,我没有为TableAs返回任何内容。
我正在使用Java 19和Hibernate 6.2.0-Final以及PostgreSQL驱动程序的42.6.0版本。
有什么建议可以让TableA返回填充了TableB的TableA吗?TableB确实与TableC有另一种关系,TableC与其他几个表有一对多关系,我在日志中也看到了对这些表的查询,即使每个关系都被标记为Lazy fetch。
编辑:修复排印错误

mklgxw1f

mklgxw1f1#

在Augusto的评论的帮助下,我解决了这个问题,看起来是@Data注解的问题。我改变了我的类,看起来像下面这样,它工作了。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TableA")
class TableA {
    @Id
    private int aId;
    private String aValue;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "TableAB",
        JoinColumns = {@JoinColumn(name="TableAId")},
        inverseJoinColumns = {@JoinColumn(name="TableBId")})
    private Set<TableB> tableBs = new HashSet<>();

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TableA tableA = (TableA) o;
        return aId == tableA.aId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(aId);
    }
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TableB")
class TableB {
    @Id
    private int bId;
    private String bValue;
    @ManyToMany(mappedBy = "tableBs")
    private Set<TableA> tableAs;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TableB tableB = (TableB) o;
        return bId == tableB.bId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(bId);
    }
}

相关问题