Jpa 在cascade EntityManager上删除
情况如下: 我有两个实体交易员和客户: -一个客户与一个交易员关联 -一个交易员可以与一个或多个客户关联 当使用EntityManager.remove(t)然后commit删除交易者时,所有与该交易者相关联的客户端将自动删除。这很好,因为它很好。 问题: 1-我如何删除我的交易者并将其客户影响到另一个交易者 2-解决方案是驻留在mySQL中消除级联效应,还是驻留在entityManager和mySQL中? 非常感谢您的帮助 客户实体Jpa 在cascade EntityManager上删除,jpa,cascade,entitymanager,cascading-deletes,Jpa,Cascade,Entitymanager,Cascading Deletes,情况如下: 我有两个实体交易员和客户: -一个客户与一个交易员关联 -一个交易员可以与一个或多个客户关联 当使用EntityManager.remove(t)然后commit删除交易者时,所有与该交易者相关联的客户端将自动删除。这很好,因为它很好。 问题: 1-我如何删除我的交易者并将其客户影响到另一个交易者 2-解决方案是驻留在mySQL中消除级联效应,还是驻留在entityManager和mySQL中? 非常感谢您的帮助 客户实体 public class Client implements
public class Client implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_client")
private Integer idClient;
@Column(name = "id_portefeuille")
private Integer idPortefeuille;
@Column(name = "id_entreprise")
private Integer idEntreprise;
@Column(name = "id_trader")
private Integer idTrader;
//other attributes
@JoinColumn(name = "id_trader", referencedColumnName = "id_trader", updatable = false, insertable = false)
@ManyToOne
private Trader idTrader2;
//getters and setters
交易实体
public class Trader implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_trader")
private Integer idTrader;
@Column(name = "nom")
//other attributes
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idTrader2")
private Collection<Client> clientCollection;
//getters and setters
公共类交易者实现可序列化{
@短暂的
私有PropertyChangeSupport changeSupport=新PropertyChangeSupport(此);
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=假)
@列(name=“id\u交易员”)
私人交易商;
@列(name=“nom”)
//其他属性
@OneToMany(cascade=CascadeType.ALL,mappedBy=“idTrader2”)
私人收藏客户收藏;
//接球手和接球手
主代码
//Getting The trader selected in a JTable
Trader t = traderList.get(tableTrader.getSelectedRow());
for (Iterator<Client> it = t.getClientCollection().iterator(); it.hasNext(); ) {
//Getting the Clients releated to this trader
Client c = it.next();
//Affecting the client to an other trader
// i chose an existing one randomly
c.setIdTrader2(traderList.get(2));
traderList.get(2).getClientCollection().add(c);
it.remove();
}
entityManager.flush();
entityManager.remove(t);
}
//在JTable中选择交易者
Trader t=traderList.get(tableTrader.getSelectedRow());
for(Iterator it=t.getClientCollection().Iterator();it.hasNext();){
//将客户关联到该交易员
客户端c=it.next();
//将客户影响给其他交易员
//我随机选择了一个现有的
c、 setIdTrader2(traderList.get(2));
traderList.get(2.getClientCollection().add(c);
it.remove();
}
entityManager.flush();
移除实体管理器(t);
}
配置的级联中不应该有删除,MySQL中也不应该有删除,实体映射中也不应该有删除。因此,该方法看起来是这样的(假设存在双向关联,并且tgetClients()
直接返回持久列表,而不制作防御副本或将其包装到未修改的代理中):
public void deletedTrader(交易者到交易者,交易者新分配的交易者){
for(Iterator it=toDelete.getClients().Iterator();it.hasNext();){
客户端c=it.next();
c、 setTrader(新分配的交易商);
newAssignedTrader.getClients().add(c);
it.remove();
}
em.remove(toDelete);
}
1st thx对于您的回复,我尝试管理您显示的实体引用,我得到了以下异常com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败您认为我应该在删除交易员之前合并新的客户端状态吗?请尝试添加em.flush()
在调用em.remove(toDelete)
之前。同样的例外,可能是我应该在删除traderList之前清除traderList向我们显示这两个实体的代码以及您正在使用的方法(通过编辑您的问题)。我最终解决了问题:除了将客户添加到新交易员的ClientList之外(newAssignedTrader.getClients().add(c);)并将其设置为新交易者(c.setTrader(newAssignedTrader);)在删除它之前,我需要更改引用第一个交易者的外键的值。(c.setIdTrader(newAssignedTrader.getIdTrader());)thx u very=)
public void deletedTrader(Trader toDelete, Trader newAssignedTrader) {
for (Iterator<Client> it = toDelete.getClients().iterator(); it.hasNext(); ) {
Client c = it.next();
c.setTrader(newAssignedTrader);
newAssignedTrader.getClients().add(c);
it.remove();
}
em.remove(toDelete);
}