首页 > 解决方案 > 列表只有一个元素

问题描述

我正在使用休眠从数据库中读取数据。我有 3 个实体,传感器、区域以及这两个实体之间的 N 对 N 关系,即实体 SensorZone。

对于每个实体,我创建了一个类,下面是示例,它们不包括构造函数、getter 和 setter:

@Entity
@Table(name = "Sensor")
public class Sensor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

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

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "zone")
    private List<SensorZone> zones = new ArrayList<>();
}

@Entity
@Table(name = "Zone")
public class Zone {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

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

    @Column(name = "max_count")
    private int maxCount;

    @Column(name = "current_count")
    private int currentCount;

    @Column(name = "created")
    private Timestamp created;

    @Column(name = "modified")
    private Timestamp modified;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sensor")
    private List<SensorZone> sensors = new ArrayList<>();
}

@Entity
@Table(name = "Sensor_Zone")
public class SensorZone {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "zone_id")
    private Zone zone;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sensor_id")
    private Sensor sensor;

    @Column(name = "enter_exit")
    private boolean enterExit;
}

我使用 PostgreSQL 作为数据库引擎,表格如下:

CREATE TABLE Sensor (
    id SERIAL,
    name TEXT NOT NULL UNIQUE,

    CONSTRAINT PK_Sensor PRIMARY KEY (id)
);

CREATE TABLE Zone (
    id SERIAL,
    name TEXT NOT NULL UNIQUE,
    max_count INT NOT NULL,
    current_count INT NOT NULL,
    created TIMESTAMP NOT NULL,
    modified TIMESTAMP NOT NULL,

    CONSTRAINT PK_Zone PRIMARY KEY (id)
);

CREATE TABLE Sensor_Zone (
    id SERIAL,
    zone_id INT NOT NULL,
    sensor_id INT NOT NULL,
    enter_exit BOOLEAN NOT NULL,

    CONSTRAINT PK_Zone_Sensor PRIMARY KEY (id, sensor_id, zone_id),
    CONSTRAINT FK_Zone_Sensor_Zone FOREIGN KEY (zone_id) REFERENCES Zone (id),
    CONSTRAINT FK_Zone_Sensor_Sensor FOREIGN KEY (sensor_id) REFERENCES Sensor (id)
);

这是 Sensor_Zone 表上的值:

Sensor_Zone 值

问题是 Sensor 的字段区域在列表中只有一个元素,即使数据库中有多个元素。

我试图把 FecthType.EAGER,但它没有改变任何东西。

标签: javahibernate

解决方案


不是确切的解决方案(也就是您的模型可以重新建模吗?)

我知道说起来容易做起来难,但是如果您可以避免在连接表上管理额外的列,您可以使用连接表的多对多标准示例来解决它。

也许有一种方法可以考虑您的额外列,以便它可以由区域传感器实体拥有?如果它设置为 TRUE,它可能是互补的,就像在多对多的一侧一样,它意味着一件事,但是当它缺失时,它相当于是 FALSE。

@Entity
@Table(name = "Sensor")
public class Sensor {
  // ...
  @OneToMany
  @JoinTable(
    name = "Sensor_Zone", 
    joinColumns = { @JoinColumn(name = "sensor_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "zone_id") }
  )
  private List<Zone> zones = new ArrayList<>();
}

@Entity
@Table(name = "Zone")
public class Zone {
  // ...
  @OneToMany
  @JoinTable(
    name = "Sensor_Zone", 
    joinColumns = { @JoinColumn(name = "zone_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "sensor_id") }
  )
  private List<Sensor> sensors = new ArrayList<>();
}

然后你的加入表不需要是一个简化事情的实体。


解决方案(这里是龙)

逃生舱口:有关解决方案,请查看Mykong 的博客

您必须考虑使用@AssociationOverrides从加入表创建的实体。还请注意一个单独的类,用@Embeddablecreated 注释来处理连接表中的复合键。


推荐阅读