Hibernate的<many-to-one>和<one-to-many>问题:

操作人:<setname="bookTs"inverse="true"><key><columnname="operator_book"/></key><one-to-m... 操作人:
<set name="bookTs" inverse = "true">
<key><column name="operator_book" /></key>
<one-to-many class="cn.henu.ntd.domain.book.Book"/>
</set>
书:
<many-to-one name="operator2" column="operator_book" cascade="persist" ></many-to-one>

我要新添加书:

Book book = new Book();
book.setName("aaa");

Operator operator2 = new Operator();
operator2.setId(1); //注意:此id数据库中已存在
book.setOperator2(operator2);
operator2.getBookTs().add(book);
bookDAO.save(book);

问题就在这里,一直想不明白...

在many-to-one中,如果设置了cascade="persist",则就会存进书,并设置好了和人的关联,并不会去更新operator表;
如果没有设置cascade="persist"或者cascade="all",则在存进书的同时,也会更新operator表,发出sql语句:Hibernate: update operator_t set name=?, password=?, system=?, reader=?, book=?, borrow=?, query=? where id=?,这时候,operator表中对应的id为1的字段被更新,其它列表全为null值了。。
有点不明白,这到底是怎么回事?
展开
 我来答
箫声客032
推荐于2016-12-02 · 超过21用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:60.2万
展开全部
hibernate在执行sava或者update的时候不会触发cascade="persist" .所以第一种情况并不会级联修改operator的数据。cascade="all" 会触发级联的,会去更新operator的内容。而你这个operator除了id之外的属性都为null,更新到数据库就都是null了。
追问
哦,明白这关系了,可是,还有一点,就是对于有id的对象,hibernate不是只更新改过的字段,不会去更新字段为null的属性(依旧默认为数据库中存在的值)和没改的字段,这怎么就更新了呢?
追答
Operator operator2 = new Operator();
你这个new出来的 除了id 其他的属性都没赋值,所以就都更新了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式