java - 列表只有一个元素
问题描述
我正在使用休眠从数据库中读取数据。我有 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 的字段区域在列表中只有一个元素,即使数据库中有多个元素。
我试图把 FecthType.EAGER,但它没有改变任何东西。
解决方案
不是确切的解决方案(也就是您的模型可以重新建模吗?)
我知道说起来容易做起来难,但是如果您可以避免在连接表上管理额外的列,您可以使用连接表的多对多标准示例来解决它。
也许有一种方法可以考虑您的额外列,以便它可以由区域或传感器实体拥有?如果它设置为 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
从加入表创建的实体。还请注意一个单独的类,用@Embeddable
created 注释来处理连接表中的复合键。
推荐阅读
- javascript - Webdriverio如何做一个TAB键动作
- ruby-on-rails - 如何在 Ruby 中访问深度嵌套散列中的值?
- javascript - 在等待递归函数时获得未定义的结果
- reactjs - 如何在 Reactjs Firebase 项目中使用 Google 服务帐户来使用 API?
- angularjs - angularjs检查密钥是否已经存在,如果不存在,则将其推送到foreach循环内的范围
- shell - 如何使用 ksh shell 脚本将 2 个整数相除并获取存储在浮点变量中的输出?
- redis - Redis 流唯一元素
- docker - 我应该将 cron 分离到它自己的 docker 容器中吗?
- sql - 如何在 Laravel 中进行这种类型的查询?
- javascript - 找不到 \node_modules\@tensorflow\tfjs-node\lib\napi-v4\tfjs_binding.node