我有2张桌子
@Entity
public class Glass {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
...
}
@Entity
public class Beer {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
...
@ManyToOne
@JoinColumn( name = "FK_GLASS", referencedColumnName = "ID" )
private Glass glass;
...
}
对于我的每一瓶啤酒,我都想知道哪种玻璃用于它。如果我删除一个与啤酒相关的玻璃杯,我想保留啤酒并将其外键设置为空。有没有办法只使用注释,或者我必须实现自定义方法将外键设置为null?
答案 0 :(得分:0)
关系维护是应用程序的责任。
如果要删除的实体(Glass
)是拥有表(FK_GLASS
)中外键(Beer
)的目标,则必须清除外键以用于删除操作成功否则最终会抛出ConstraintViolationException。
所以你需要实现一个自定义方法,即
public void removeGlass(long beerId) {
Beer beer = em.find(Beer.class, beerId)
if (beer != null) {
Glass glass = beer.getGlass();
beer.setGlass(null); // UPDATE BEER SET FK_GLASS=NULL WHERE ID=?
em.remove(glass);
}
}