关系表删除级联有4种情况,但Entity-config仅允许2种

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每个外键(FK1FK2)。


事实1

如果既不删除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)

事实2

如果不是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)

事实4

如果是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是为了维护两方之间的关系。因此,如果它设计为允许两次删除级联,它将:

  1. 很难明白
  2. 导致一些你不希望看到的情况

维护关系最好的方式就是直接操作关系表。之后,您可以根据需要删除/添加组表或用户表。

@ManytoMany这个注解在我看来就是为了引导我们操作关系表。 我不知道我是否回答了你的问题。如果我这样做了,请告诉我,谢谢。