私はSpringブートアプリケーションの2つのエンティティ間に多対多リレーションシップを追加しています。Hibernateの多対多リレーションは空のコレクションを返します
Business.java:
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "business_vendor",
joinColumns = @JoinColumn(name = "business_id"),
inverseJoinColumns = @JoinColumn(name = "vendor_id"))
@JSON(include = false)
protected List<Vendor> vendors;
Vendor.java
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "vendors")
@JSON(include = false)
protected List<Business> businesses;
私は、その後のビジネスにベンダーを追加し、それをデータベースに保存することができる午前私は、以下のマッピングを持っています。しかし、(新しい要求で)私はビジネスを読み込んでbusiness.getVendors()
と呼ぶと、私は空のリストを取得します。私はアプリケーションログからHibernateがリンクテーブルから選択していることを知ることができます。データベースに対して手動でHibernateが生成したクエリを手動で実行すると、期待どおりに1つの行が表示されます。私は熱心にFetchModeを切り替えようとしましたが、いずれも助けにならなかったCascadeType.ALL
を削除しようとしました。
このアプリケーションはHibernate 4.3.11です(この時点では「理由」はアップグレードできません)。
編集:ここでは、最小限の例です:
public List<Vendor> getVendorsForBusiness(UUID businessId) {
Business business = businessRepository.findOne(businessId.toString());
return business.getVendors();
}
行がデータベースにリンクテーブルにあるにもかかわらず、私はこれが1つのベンダーとのリストを返すことを期待するが、私は空のリストを取得します。
編集2:
public void addVendorToBusiness(UUID businessId, UUID vendorId) {
Vendor vendor = vendorRepository.findOne(vendorId.toString());
Business business = businessRepository.findOne(businessId.toString());
business.getVendors().add(vendor);
vendor.getBusinesses().add(business); // This line doesn't make a difference
businessRepository.save(business);
}
persistメソッドを使用して最小限の例を作成します。マッピングは良いようです。 – jklee
私は@jkleeと合意しています。他の人があなたの質問に答えるのを助けるもっと完全な例です。 – Dale
エンティティをどのように保存しますか?私のプロジェクトにマッピングされます。 – jklee