列表只有一个元素

时间:2019-07-18 23:55:25

标签: java hibernate

我正在使用休眠模式从数据库读取数据。我有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_Zone values

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

我尝试放入FecthType.EAGER,但没有做任何更改。

1 个答案:

答案 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注释,以处理联接表中的组合键。