2017-03-15 8 views
0

私は、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); 

    ... 
} 

、私はTwoWayServicefindOneを呼び出すとき、私は私が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]> 

。私はこれらがどこから来ているのかわかりません。これらの余分なオブジェクトがリストに表示されるのはなぜですか?

答えて

0

私は確信していますが、コンストラクタに2つのサービスを追加し、各セッターに1つのサービスを追加するためです。これにより、合計で4つになります。あなたはサービスの量をテストします、それはあなたがテストしたかったものですか?

+0

私はsettersで 'List.set'を呼び出しています。これは指定されたインデックスの項目を置き換えます。 'List.add'は新しいものを追加します。それは不思議です、リストの要素0と1はservice1オブジェクトであり、要素2と3はservice2オブジェクトです。私はコンストラクタでデフォルトを作成しないようにしましたが、同じ結果です。 – AlanW

関連する問題