0

次のエンティティ モデルを検討してください。

ドシエ エンティティ。

@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);

何らかの理由で、コミッションにブラケットが付いているかどうかに関係なく、次のことを行う必要があります。

  1. 既存のコミッションのブラケットをクリアします
  2. 保存
  3. 既存の手数料を削除
  4. 保存
  5. 新しい手数料を維持する
  6. ドシエに新しい手数料を設定する
  7. 保存

ステップのいずれかをスキップすると、次のエラーが発生します。

cascade="all-delete-orphan" を持つコレクションは、所有エンティティ インスタンスによって参照されなくなりました: Commission.commissionBrackets

これにはもっともらしい説明があるかもしれませんが、それは非常に醜く感じられ、おそらくそれを行うよりクリーンな方法がありますか? 既存のコミッションを削除する代わりに、完全に更新することもできますが、それは実際の機能を反映していません。

使用される Hibernate バージョン: 4.3.10.Final DB 使用: postgres 9.4.4.1

だから私の質問はです。私はそれを正しくやっていますか、それともどこかで改善されていますか?

4

1 に答える 1