【问题标题】:Spring jpa onetomany returns only one elementSpring jpa onetomany 只返回一个元素
【发布时间】:2017-12-08 13:57:50
【问题描述】:

我正在尝试与 spring 数据 jpa 建立双向的一对多关系,但带有 @onetomany 注释的列表总是返回一个元素。

这是我的实体的代码(省略了 setter 和 getter):

@Entity
@Table(name = "sdk_sdk")
public class SDKEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String version;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "sdk")
@OrderBy("order ASC")
private List<SDKFileEntity> fileEntities;
}

还有第二个实体:

@Entity
@Table(name = "sdk_file")
public class SDKFileEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String fileType;
private Integer sdkId;

public SDKFileEntity() {
}

@ManyToOne
@JoinColumn(name = "id", insertable = false, updatable = false)
private SDKEntity sdk;

我正在尝试进行多方映射,其中 sdkId 对应于 SDKEntity 类中的 id。 每当我尝试使用 spring 的存储库从 sdkEntity 获取 sdkfiles 时,列表的大小始终为 1。

例如:

SDKEntity entity=repository.findOne(foo);
List<SDKFileEntity> files=entity.getFileEntities();

这里文件的大小是1,我必须从数据库中删除第一个元素以获得第二个元素。

【问题讨论】:

  • 可能只有一个SDKFileEntity与找到的SDKEntity entity相关联
  • 展示如何为 sdkenttity 添加元素
  • 在我创建实体之前元素已经在表格中

标签: java hibernate spring-data-jpa


【解决方案1】:

对我来说,这里的原因是父实体实现了 equals 和 hashcode 不幸的是,所有现有实体都是平等的。 并且没有一个子实体自己实现它。

那么@OneToMany 关系只返回第一个元素。

花了我一些时间。

【讨论】:

    【解决方案2】:

    这部分代码看起来很可疑

    @ManyToOne
    @JoinColumn(name = "id", insertable = false, updatable = false)
    private SDKEntity sdk;
    

    name = "id" 它应该是写在数据库列名中的实际列名,像这样

        @JoinColumn(name = "VISIT_ID", referencedColumnName = "ID")
        @ManyToOne
        private Visit visitId;
    

    【讨论】:

    • 在我的数据库里其实只是叫id。
    • 那么关于 SDKFileEntity 表的 id 呢??
    • 同,也叫id
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多