2017-07-12 11 views
0

私の双方向の関係が機能しません。 チュートリアルの時間を読んだ後、私はこのクラスを持っている:JPAマッピング:OneToMany(双方向)関係が機能しません

SourceSystems.java

@Entity 
@Table(name = "source_systems") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class SourceSystems implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@NotNull 
@Column(name = "name", nullable = false) 
private String name; 

@NotNull 
@Column(name = "url", nullable = false) 
private String url; 

@Column(name = "identifier") 
private String identifier; 

@NotNull 
@Column(name = "trading_activated", nullable = false) 
private boolean tradingActivated; 

@OneToMany(mappedBy="sourceSystems", fetch = FetchType.EAGER) 
private List<Currency> currencies; 

// getters and setters 

Currency.java

@Entity 
@Table(name = "currency") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Currency implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@NotNull 
@Column(name = "name", nullable = false) 
private String name; 

@NotNull 
@Column(name = "identifier", nullable = false) 
private String identifier; 

@Column(name = "currency_ext_id") 
private String currencyExtId; 

@Column(name = "disabled") 
private Boolean disabled; 

@Column(name = "date_added") 
private ZonedDateTime dateAdded; 

@ManyToOne 
@JoinColumn(name="source_systems_id") 
private SourceSystems sourceSystems; 

一つ SourceSystemはn個通貨を持っています。 私の目標は、SourceSystemsのリストを取得し、各ソースシステムでその通貨リストの通貨を取得することです。私は

sourceSystemsRepository.findAll(); 

を呼び出すと

これは、ソースsstemsのリストを私に戻って与えるが、その通貨はnullです。私はまた、このようなリポジトリに参加する上でそれを試してみました: It duplicates the Source System objects by the number of the currencies

それはSourceSystemsのセットを私に戻っていますが、彼らは多くのように重複している:1は本当に奇妙な私に何かを返したこと

@Query("select source_systems from SourceSystems source_systems inner join source_systems.currencies currs where source_systems.tradingActivated = true") 
List<SourceSystems> findAllActiveSourceSystemsWithCurrencies(); 

私はsourceSystemの通貨を持っているのでしかし、SourceSystemの内部では、通貨リストはnullです。

呼び出し例外について:私はtoStringメソッドを何度も再生成しましたが、成功しませんでした。

私はリポジトリにクエリに何か問題があると仮定します。

誰でも教えてください。

答えて

0
  1. 私は@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)が Plsのは、詳細についてはhibernate docを読んで、この問題を作成していることは、それを削除してください、あなたはすでにFetchType.EAGERが正常に動作する必要があり、指定されているように再度お試し と思います。 1は私に本当に奇妙な何か返したこと

  2. =>をそれはあなたが内部をやっているのは明らかですので、あなたの親テーブルが参加するため、子テーブルとして として何回も繰り返される参加します。 List通貨を繰り返し処理しても問題ありません。

0

あなたが直面しているのはおそらく遅延ロードです。

JOIN FETCHをお試しください。子エンティティと親エンティティをフェッチしてください。

@Query("select source_systems from SourceSystems source_systems join fetch source_systems.currencies currs where source_systems.tradingActivated = true") 
List<SourceSystems> findAllActiveSourceSystemsWithCurrencies(); 
関連する問題