我正在使用休眠模式从数据库读取数据。我有3个实体,即sensor,zone和这两个实体之间的N到N关系,即实体SensorZone。
对于每个我创建的实体,下面都是示例,它们不包含构造函数,getter和setter:
CREATE POLICY view_users ON users TO roleB
USING (manager = current_user);
我使用PostgreSQL作为数据库引擎,表如下:
@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;
}
这是表Sensor_Zone上的值:
问题是Sensor的字段区域在列表中只有一个元素,即使数据库中有多个元素。
我尝试放入FecthType.EAGER,但没有做任何更改。
答案 0 :(得分:1)
我知道说起来容易做起来难,但是如果您可以避免在连接表上管理多余的列,则可以使用多对多连接表的标准示例来解决它。 。
也许有一种方法可以考虑您的额外列,以便它可以由 Zone 或 Sensor 实体拥有?也许它是互补的,例如如果设置为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's blog
您必须研究在通过联接表创建的实体上使用@AssociationOverrides
。另请注意,还创建了一个单独的类,用@Embeddable
注释,以处理联接表中的组合键。