0

さて、私は困っていて、それについての質問が見つかりません。別のエンティティと OneToMany 関係を持つエンティティがあります。'another' を one's List から削除してみました。その後、それをマージしてみました。しかし、それはうまくいきません。データベースから「別の」を削除したくありません。リストから削除したいだけです。

これは私のコードです:

public class ParametrosVingentes implements Serializable {

    // ...
    @OneToMany(targetEntity=AgendamentoImportacaoZeus.class, cascade={CascadeType.REFRESH, CascadeType.MERGE})
    @JoinTable(
            name="ImportacaoZeusVingentes",
            joinColumns = @JoinColumn(name="parametros_vingentes_fk"),
            inverseJoinColumns = @JoinColumn(name="agendamento_fk")
    )
    private List<AgendamentoImportacaoZeus> agendamentosImportacaoZeus;

    // ...

}

AgendamentoImportacaoZeus は「別の」エンティティです。

@Entity
@NamedQueries(value = {
    @NamedQuery(name = "AgendamentoImportacaoZeus.listarPorDataCriacao", query = "SELECT a FROM AgendamentoImportacaoZeus a ORDER BY a.dataCriacao DESC"),
    @NamedQuery(name="AgendamentoImportacaoZeus.getPorData", query="SELECT a FROM AgendamentoImportacaoZeus a WHERE a.agendamento = :data"),
    @NamedQuery(name="AgendamentoImportacaoZeus.vingentes", query="SELECT ag FROM ParametrosVingentes p JOIN p.agendamentosImportacaoZeus ag WHERE p.id = :id")
})
@SequenceGenerator(name = "SEQ", sequenceName = "SEQ_AG_IMP_ZEUS")
public class AgendamentoImportacaoZeus implements Serializable, Agendamento {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ")
    private Long id;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date dataCriacao;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date agendamento;

    // ...

エンティティをマージするコード:

ParametrosVingentes parametrosVingentes = parametrosVingentesDao.buscar(ParametrosVingentes.ID);
List<? extends Agendamento> agendamentosVingentes;
// ...
agendamentosVingentes = parametrosVingentes.getAgendamentosImportacaoZeus();
// ...
for(int i=0; i<agendamentosVingentes.size(); i++){
    if(agendamentosVingentes.get(i).getAgendamento().compareTo(dataAgendamentoDesmarcar) == 0){
        agendamentosVingentes.remove(i);
        break;
    }
}
// ...
entityManager.merge(parametrosVingentes);

コレクションからエンティティを削除してマージすると、RELATIONSHIP が削除されますか?

コードをデバッグし、マージ後、削除した要素のない AgendamentoImportacaoZeus のリストを取得しました。しかし、データベースから ParametrosVingentes を取得すると、再び存在します。

entityManager は Spring によって制御されます。メソッドはトランザクションです。それなら普通にフラッシングしてると思います。

ご清聴ありがとうございました。

アップデート:

この投稿を見て、マッピングを変更しようとしました。今、私は次のものを持っています:

@Entity
public class ParametrosVingentes implements Serializable {

    // ...
    @OneToMany(mappedBy="parametrosVingentes", cascade={CascadeType.ALL})
    private List<AgendamentoImportacaoZeus> agendamentosImportacaoZeus;
    // ...
}

@Entity
@NamedQueries(value = {
    @NamedQuery(name = "AgendamentoImportacaoZeus.listarPorDataCriacao", query = "SELECT a FROM AgendamentoImportacaoZeus a ORDER BY a.dataCriacao DESC"),
    @NamedQuery(name="AgendamentoImportacaoZeus.getPorData", query="SELECT a FROM AgendamentoImportacaoZeus a WHERE a.agendamento = :data"),
    @NamedQuery(name="AgendamentoImportacaoZeus.vingentes", query="SELECT ag FROM ParametrosVingentes p JOIN p.agendamentosImportacaoZeus ag WHERE p.id = :id")
})
@SequenceGenerator(name = "SEQ", sequenceName = "SEQ_AG_IMP_ZEUS")
public class AgendamentoImportacaoZeus implements Serializable, Agendamento {

    // ...
    private ParametrosVingentes parametrosVingentes;
    // ...

}

私はこれを試しています:

Agendamento agendamento = null;
for(int i=0; i<agendamentosVingentes.size(); i++){
    if(agendamentosVingentes.get(i).getAgendamento().compareTo(dataAgendamentoDesmarcar) == 0){
        agendamento = agendamentosVingentes.remove(i);
        agendamento.setParametrosVingentes(null);
        break;
    }
}
entityManager.merge(parametrosVingentes);
entityManager.merge(agendamento);

なぜ更新されないのか誰か知っていますか?

4

0 に答える 0