外键约束失败,JPA(ManyToOne关系)

时间:2014-03-18 22:41:14

标签: jpa foreign-keys many-to-one

我有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?

1 个答案:

答案 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);
    }
}