次のエンティティ モデルを検討してください。
ドシエ エンティティ。
@Entity
@Table(name = "dossiers", uniqueConstraints = @UniqueConstraint(columnNames = { "site_id", "dossier_id" }))
@Audited(withModifiedFlag = true)
@Access(AccessType.FIELD)
public final class Dossier extends EntityObject {
@Column(name = "name", nullable = false, length = 255)
private String name;
@OneToOne(fetch = FetchType.EAGER, mappedBy = "dossier", optional = true, cascade = CascadeType.ALL, orphanRemoval = true)
private Commission commission;
}
手数料エンティティ。
@Entity
@Table(name = "commissions")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@Access(AccessType.FIELD)
public class Commission extends EntityObject{
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "commission", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@OrderBy(clause = "boundary ASC NULLS LAST")
private List<CommissionBracket> commissionBrackets;
@OneToOne(optional = true)
@JoinColumn(name = "dossier_id", nullable = true)
private Dossier dossier;
}
ブラケット エンティティ。
@Entity
@Table(name = "commission_brackets")
@Access(AccessType.FIELD)
public class CommissionBracket extends EntityObject {
@ManyToOne(optional = false)
@JoinColumn(name = "commission_id")
private Commission commission;
@Column(name = "boundary")
private Integer boundary;
}
今、ドシエからのコミッションを置き換えたいとき。私はこれをしなければなりません:
boolean notSaved = true;
if(domain.getCommission() != null) {
toSave.setCommission(domain.getCommission());
toSave.getCommission().getCommissionBrackets().clear();
toSave = dossierRepository.save(toSave);
toSave.setCommission(null);
toSave = dossierRepository.save(toSave);
notSaved = false;
}
if(dossier.getCommission() != null) {
final Commission newCommission = commissionRepository.save(dossier.getCommission());
toSave.setCommission(newCommission);
toSave = dossierRepository.save(toSave);
notSaved = false;
}
if(notSaved) {
toSave = dossierRepository.save(toSave);
}
リポジトリでの保存操作では、渡されたオブジェクトに ID が設定されているかどうかに応じて、永続化またはマージが行われることに注意してください。
正気の普通の人は、単純にできると思うでしょう:
dossier.setCommission(newCommission);
dossierRepository.save(newCommission);
何らかの理由で、コミッションにブラケットが付いているかどうかに関係なく、次のことを行う必要があります。
- 既存のコミッションのブラケットをクリアします
- 保存
- 既存の手数料を削除
- 保存
- 新しい手数料を維持する
- ドシエに新しい手数料を設定する
- 保存
ステップのいずれかをスキップすると、次のエラーが発生します。
cascade="all-delete-orphan" を持つコレクションは、所有エンティティ インスタンスによって参照されなくなりました: Commission.commissionBrackets
これにはもっともらしい説明があるかもしれませんが、それは非常に醜く感じられ、おそらくそれを行うよりクリーンな方法がありますか? 既存のコミッションを削除する代わりに、完全に更新することもできますが、それは実際の機能を反映していません。
使用される Hibernate バージョン: 4.3.10.Final DB 使用: postgres 9.4.4.1
だから私の質問はです。私はそれを正しくやっていますか、それともどこかで改善されていますか?