私は、1対多の多対1の関係を持ついくつかのエンティティクラスを持っています。私はSpringとHibernateを使用しています。スプリングデータJPA Hibernate - @ManyToOne関係に表示される余分な要素
各TwoWayService
は、私のアプリケーションでは正確に2 Service
です。
抜粋:
@Entity
@Table(name = "two_way_services")
public class TwoWayService {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "twoWayService",
fetch = FetchType.EAGER)
private List<Service> services;
public TwoWayService() {
services = new ArrayList<>();
// Add two as default
services.addAll(Arrays.asList(new Service(), new Service()));
}
public void setService1(Service service) {
services.set(0, service);
service.setTwoWayService(this);
}
public void setService2(Service service) {
services.set(1, service);
service.setTwoWayService(this);
}
...
}
@Entity
@Table(name = "services")
public class Service {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@ManyToOne(optional = false)
@JoinColumn
private TwoWayService twoWayService;
public void setTwoWayService(TwoWayService twoWayService) {
this.twoWayService = twoWayService;
}
...
}
私はバックエンドでダービーを使用しています。データベーススキーマは、このようなものです:
CREATE TABLE two_way_services (
id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
config_name VARCHAR(255) NOT NULL,
name VARCHAR(80),
admin_ip VARCHAR(32) NOT NULL,
connection_state INT NOT NULL
);
CREATE TABLE services (
id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
name VARCHAR(80),
type INT NOT NULL,
ruleset VARCHAR(255) NOT NULL,
two_way_service_id INT,
FOREIGN KEY (two_way_service_id) REFERENCES two_way_services(id) ON DELETE CASCADE
);
リポジトリインターフェース:私のユニットテストで
public interface TwoWayServiceRepository extends Repository<TwoWayService, Integer> {
<S extends T> S save(S entity);
...
}
、私はTwoWayService
にfindOne
を呼び出すとき、私は私が4 Services
の代わりに持っていることを見つけることがわかります2.データベースをブラウズすると、期待通りのデータが直接表示されます。期待のコピーです、私は期待して2プラス2の余分なもの:私はservices
、リスト内の4つの要素を参照してくださいデバッガでそれを調べる
TwoWayService tws1 = repo.findOne(1); // get by id
assertThat(tws1.getServices().size()).isEqualTo(2); // fails, expected:<[2]> but was:<[4]>
。私はこれらがどこから来ているのかわかりません。これらの余分なオブジェクトがリストに表示されるのはなぜですか?
私はsettersで 'List.set'を呼び出しています。これは指定されたインデックスの項目を置き換えます。 'List.add'は新しいものを追加します。それは不思議です、リストの要素0と1はservice1オブジェクトであり、要素2と3はservice2オブジェクトです。私はコンストラクタでデフォルトを作成しないようにしましたが、同じ結果です。 – AlanW