假设我有一个关系Master Slave。在数据库中,表Master中有一行,id = 1。 为什么以下代码有效:
Slave slave = new Slave();
slave.setId(1L);
Master master = new Master();
master.setId(1L);
slave.setMaster(master);
em.persist(slave);
所以Master是分离的实体,并且在创建了slave和master之间的commit refence之后。为什么?我想知道,在案例中我们必须通过“find”函数从数据库中读取Master行。 我在哪里可以阅读更多相关信息?
答案 0 :(得分:1)
欢迎来到Hibernate关系的黑暗之地。首先,如果你想了解添加到你的hibernate.cfg.xml
的内容<property name="show_sql">true</property>
感谢您在控制台中看到Hibernate为您执行的所有SQL查询 - 这是了解Hibernate在特定时刻如何工作的最佳方式。
回到意想不到的结果。重要的是谁拥有关系。在你的情况下,我猜在Slave表中有外键指向Master表主键(显然你也可以使用连接表 - 无所谓)。
Hibernate,在创建关系时,只关心拥有关系的那一方 - 在你的情况下,它足以在Slave表中保存有关新关系的信息。事实上,Master不需要知道关系,因此没有必要在该实体上调用save。这就是你的代码有效的原因。
有用的阅读: