2016-06-22 5 views
0

を削除する前に関係をリフレッシュしますは、どのように私はこのように設定する別のものと@OneToMany関係を持つエンティティを削除したいエンティティ

public class Dealership implements Serializable { 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "dealership", orphanRemoval = true) 
    private Set<Car> cars; 
} 

public class Car implements Serializable { 

    @ManyToOne 
    @JoinColumn(name="co_id") 
    private Dealership dealership; 

} 

事があり、その私がディーラーを削除すると、I販売されていない車のみを削除したいそして私が何を試みても、Hibernateはカスケードを通じてディーラーと結んだすべての車を削除します。ここで私が試してきたものがあります。この例では、販売した車を別のディーラーに譲渡しようとしていますが、ディーラーを削除します。

Session session = SessionManager.getSession(); 
Transaction tx = session.beginTransaction(); 

Dealership dealershipToDelete = (Dealership) session.load(Dealership.class, idDealership); 

for(Car c: dealershipToDelete.getCars().stream().filter(c -> c.isSold()).toArray(Car[]::new)){ 
    Dealership newDealership = (Dealership) session.load(Dealership.class, idNewDealership); 
    c.setDealership(newDealership); 
    dealershipToDelete.getCars().remove(c); 
} 

session.update(dealershipToDelete); 

session.flush(); 

session.delete(dealershipToDelete); 

tx.commit(); 

session.close(); 

しかし、それは常にすべての車を削除します。これは、販売代理店、従業員、および販売されていなかった車のみを削除することになっています。私がHibernateに新しいディーラーと車をアップデートさせるようにしても。それらを更新し、削除します。ヘルプは非常に高く評価されます。ありがとう。

+0

あなたは新しいディーラーに車を追加していません。あなたは古いディーラーから車を取り外すことはありません。 –

+0

申し訳ありませんが、古いディーラーから車を取り外したラインを追加するのを忘れました。私はこれを投稿する前にすでにテストしました。それでも動作しません。 私は新しい関係にこれを追加しませんでした。しかし、今、私は(それの終わりに)ループにこの行を追加したこと:。 'newDealership.getCarsを()(c)を追加;' それは、この例外がスローされます:スレッド「メイン」組織で 例外。 hibernate.ObjectDeletedException:削除されたオブジェクトはカスケード(削除されたオブジェクトを関連付けから削除)で再保存されます:[hibernate.entities.Car#14] – MatiasP

+0

@MatiasMGSはあなたの問題を解決しましたか? –

答えて

1

はジャスト(リフレッシュ)ディーラーオブジェクトを車class.Haveは少しあなたのコードを修正との関係に加えられた変更を反映するために、それを削除する前に、これを試してください:

Dealership dealershipToDelete = (Dealership) session.load(Dealership.class, idDealership); 
Dealership newDealership = (Dealership) session.load(Dealership.class, idNewDealership); 
for(Car c: dealershipToDelete.getCars().stream().filter(c -> c.isSold()).toArray(Car[]::new)){ 
    c.setDealership(newDealership); 
    newDealership.getCars().add(c); 
} 
session.flush(); //this will flush the updates to sold Car, with the new Dealership details 
session.refresh(dealershipToDelete); //this will load the updated "dealershipToDelete" without the 'Sold Car' object,the 'Unsold' ones will still be there 
session.delete(dealershipToDelete); //this will delete the Dealership and its related unsold car objects. 

tx.commit(); 

session.close(); 
1

あなたはこのような何かを試してみてください:

は最初のNULL可能への外部キー設定:

public class Car implements Serializable { 

    @ManyToOne 
    @JoinColumn(name="co_id" , nullable = true) 
    private Dealership dealership; 

} 

を、あなたはdealershipToRemoveのIDを取得:

int id = dealershipToRemove.getId(); 

、あなたはすべての車を削除します指定されたIDを持つ販売代理店がある

query = session.createNativeQuery("delete from cars where co_id = :id and date is null"); 
query.setParameter(1,id); 
query.executeUpdate(); 

あなたはdealershipToRemoveとその車との間の関係を壊す:

dealershipToRemove .setCars(null); 
session.remove(dealershipToRemove); 
+0

それだけですべての車を削除しないのですか?したがって、 'session.remove(dealershipToRemove)'は、すべてのものとまったく同じ効果を持ちます。 ""と日付をnullにすると ""それを修正するだろうが、私はSBの答えのように、クエリの代わりに休止状態を使う解決策を探していた。 – MatiasP

+0

はい、あなたの権利! (y) –

関連する問題