如何在一个查询中正确地从数据库中删除记录。例如,当实体使用@MapsId注解来使用父实体的主键时,如果父条目被删除,它将保证父条目的ID在子实体中使用。
代码示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private String name;
}
@Entity
public class UserDetails {
@Id
private long id;
private String phone;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
private User user;
}
在这里,当使用JpaRepository删除方法删除用户时,将发生UserDetail使用主键User的错误
2条答案
按热度按时间f87krz0w1#
首先,您确定关系的方向是有意义的吗?我希望它是相反的,因为用户ID和名称似乎是您更经常需要的更基本的信息。
其次,您所做的似乎是优化性能的尝试,因为您也可以将所有数据存储在单个实体中。您确定优化会带来回报吗?(我猜不会。)参见Premature Optimization。
第三,* 如果 * 关系是相反的,您可以将注解修改为
@OneToOne(cascade=CascadeType.DELETE)
或@OneToOne(cascade=CascadeType.ALL)
,以便让JPA在删除第一个实体时自动删除另一个实体。cld4siwp2#
为此,您需要删除所有由主键使用的外键
或使用级联
之后使用以下内容
在JPA中,我们可以使用deleteById
或通过命名查询
从ID =?1的员工中删除
或我的本机查询
从id =?1的员工中删除