冬眠。为什么删除单个孩子会导致单向一对多关联中所有孩子的删除?

时间:2018-11-18 21:08:11

标签: java hibernate associations one-to-many

从下至上的第三个数据库命令是DELETE FROM Person_Phone 在哪里Person_id = 1 为什么删除个人ID而不是直接删除电话ID? 特别是因为那是Java代码明确地对person.getPhones()。remove(phone1)进行的操作 。 PS。我从此链接复制了下面的代码 http://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#associations

//this is Java code
Person person = new Person();
Phone phone1 = new Phone( "123-456-7890" );
Phone phone2 = new Phone( "321-654-0987" );

person.getPhones().add( phone1 );
person.getPhones().add( phone2 );
entityManager.persist( person );
entityManager.flush();

person.getPhones().remove( phone1 );

//this is the database generated code
INSERT INTO Person
       ( id )
VALUES ( 1 )

INSERT INTO Phone
       ( number, id )
VALUES ( '123-456-7890', 2 )

INSERT INTO Phone
       ( number, id )
VALUES ( '321-654-0987', 3 )

INSERT INTO Person_Phone
       ( Person_id, phones_id )
VALUES ( 1, 2 )

INSERT INTO Person_Phone
       ( Person_id, phones_id )
VALUES ( 1, 3 )

DELETE FROM Person_Phone
WHERE  Person_id = 1

INSERT INTO Person_Phone
       ( Person_id, phones_id )
VALUES ( 1, 3 )

DELETE FROM Phone
WHERE  id = 2

1 个答案:

答案 0 :(得分:1)

在您提供的链接中,所有关联都定义了一个层叠属性,这意味着每当一个事件被触发(插入,更新,删除...),它们都将遵循其中的层叠类型值,因此它们都已设置为级联类型。这意味着每当父母被删除(例如插入)时,他所有的孩子也将被删除(例如插入)

如果您想了解更多有关此行为的信息,这里是一个不错的article