Pet*_*der 9 java many-to-many hibernate cascading-deletes
我有两个普通表和一个关系表。
--------------------------------------------------
| Group | Membership | User |
| (ID, NAME) |(GRP_ID, U_ID) |(ID, FORENAME) |
--------------------------------------------------
| 1, Admin | 1, 1 | 1, Joe |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
成员有两个外键
FK1 Membership.GRP_ID -> Group.ID
FK2 Membership.U_ID -> User.ID
Run Code Online (Sandbox Code Playgroud)
我可以设置cascade-delete每个外键(FK1和FK2)。
如果既不删除FK1也不FK2删除级联,则我也无法删除Admin或Joe,因为它们保持“成员身份”连接。
--------------------------------------------------
| Group | Membership | User |
| (ID, NAME) |(GRP_ID, U_ID) |(ID, FORENAME) |
--------------------------------------------------
| 1, Admin | 1, 1 | 1, Joe |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
如果不是FK1层叠删除FK2,则可以删除管理员(删除成员身份),但是不能删除Joe。
FK1 Membership.GRP_ID -> Group.ID
FK2 Membership.U_ID -> User.ID
Run Code Online (Sandbox Code Playgroud)
如果不是FK2级联删除FK1,则可以删除Joe(删除成员资格),但不能删除Admin。
CREATE TABLE Membership (
GRP_ID INT NOT NULL,
U_ID INT NOT NULL,
FOREIGN KEY (GRP_ID) REFERENCES Group (id),
FOREIGN KEY (U_ID) REFERENCES User (id)
);
Run Code Online (Sandbox Code Playgroud)
如果是FK2级联删除和 FK 1级联删除。删除Joe将删除成员资格,但Admin保持不变。删除管理员将删除成员资格,但乔保持不变。
CREATE TABLE Membership (
GRP_ID INT NOT NULL,
U_ID INT NOT NULL,
FOREIGN KEY (GRP_ID) REFERENCES Group (id) ON DELETE CASCADE,
FOREIGN KEY (U_ID) REFERENCES User (id)
);
Run Code Online (Sandbox Code Playgroud)
Java代码组:
CREATE TABLE Membership (
GRP_ID INT NOT NULL,
U_ID INT NOT NULL,
FOREIGN KEY (GRP_ID) REFERENCES Group (id),
FOREIGN KEY (U_ID) REFERENCES User (id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
当关系表包含两个外键时,这些外键可将大小调整为大小写2x2=4,为什么批注@ManyToMany只允许一个删除级联?
小智 -1
在这种情况下,您不想在删除组或用户时删除另一方。
@ManytoMany是为了维护两方之间的关系。因此,如果它设计为允许两次删除级联,它将:
维护关系最好的方式就是直接操作关系表。之后,您可以根据需要删除/添加组表或用户表。
@ManytoMany这个注解在我看来就是为了引导我们操作关系表。 我不知道我是否回答了你的问题。如果我这样做了,请告诉我,谢谢。
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |