リストには、一つだけの要素を持っています

gqmartins:

私は、データベースからデータを読み取るために休止状態を使用しています。私は3つのエンティティ、センサー、ゾーンとエンティティSensorZoneであるこれら2つのエンティティ間のN Nとの関係を、持っています。

各エンティティのために私はフォローが、彼らは、コンストラクタ、ゲッターとセッターを含んでいないことを例にクラスを作成しました:

@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値

問題があっても、データベース内の複数の要素があり、センサからのフィールドゾーンのみリスト内の1つの要素を有することです。

私は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参加するテーブルで複合キーに対処するために作成します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231181&siteId=1