さて、私は困っていて、それについての質問が見つかりません。別のエンティティと 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);
なぜ更新されないのか誰か知っていますか?