attempted to assign id from null one-to-one
one-to-one在hibernate中可以用来作为两张表之间的主键关联,这也是hibernate中主键关联的一种用法,这样在一张表中的ID,在生成另外一张表的同时回自动插入到相应的ID字段中去,相应的XML文件设置比较简单,举例如下:
<!-- 建立一对一的到Address的映射,这个是写在User的XML配置文件中的 -->
<!-- 相应的User bean(PO)中也要添加属性 com.xx.Address address-->
<one-to-one name="address" cascade="all" class="com.xx.Address"/>
<!-- cascade的属性设置不再重复了,可以查看hibernate文档 -->
<!-- 建立一对一的到User的映射,这个是写在Address的XML配置文件中的 -->
<!-- 相应的Address bean(PO)中也要添加属性 com.xx.User user--> -->
<one-to-one name="user" class="com.xx.User" constrained="true"/>
为了在Address中使用User中的主键ID值,我们需要设置Address中的主键生成规则,如下所示,采用foreign关键字
<id column="ID" name="id" type="long" unsaved-value="0">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
这里需要注意的是property的属性值必须与上面到User的映射所填写的name属性值一致,这样就完成了one-to-one的映射关系。
上面的过程都很简单,下面我来说说这里需要注意的地方:
1. 在设置属性ID的时候必须注意字段的长度,如笔者这样使用oracle的sequence来生成ID,其长度有14位之长,则应选择hibernate类型long,对应的实体中应选择Long,这样不会出现溢出的情况。
2. 在测试的时候必须要注意这两张表之间因为已经存在了一对一的关系,所以我们不能只写
user.setAddress(address);
而忽略了
address.setUser(user);
这样在做插入的时候会报出attempted to assign id from null one-to-one property: address的错误,这一点初学者会经常犯,笔者也是其中之一。
3. 如果不写cascade="all"或者写成cascade="none"的话,即使你写了
user.setAddress(address);
address.setUser(user);
也不会发生任何事情,只有user会被存储。
4. one-to-one的效率问题-------one-to-one在查询时,总是查出和主表关联的表,而且one-to-one的lazy属性只有false proxy no-proxy三种,没有true。outer-join="false"也只是徒增查询语句条数,把本来的一条sql语句变成多条。所以在one-to-one这种一对一的关系不是很强的情况下(one-to-one关系强即总是查出这所有的几个关联表),或者是在一张表中存在多个one-to-one的情况下,使用最好one-to-many来代替one-to-one。
最新文章
- php清理当前目录下的指定文件和空目录(源码),建议服务器端执行
- 我也说百度和google
- php碎片
- Leetcode: Non-overlapping Intervals
- 【Java/Android性能优化1】Android性能调优
- PAT1014——福尔摩斯的约会
- CodeForces 474.D Flowers
- Effective Java实作equals() - 就是爱Java
- 脑波设备mindwave TGCD接口开发示例
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
- POJ2029——Get Many Persimmon Trees
- Spring框架学习笔记(7)——代理对象实现AOP
- RabbitMQ-Spring AMQP
- 通过sqlalchemy操作mysql
- makefile笔记7 - makefile函数
- 原生JS获取DOM 节点到浏览器顶部的距离或者左侧的距离
- springboot 学习之路 22 (读取自定义文件)
- linq总结系列(二)---Expression
- nyoj-489-dinic/建图
- 安装maven和glassfish及配置环境变
热门文章
- 探索 OpenStack 之(13):研究 Keystone
- selenium遇到异常自动截图
- codeforces 484B B. Maximum Value(二分)
- SqlServer 注入技巧
- 原生js实现增加(addclass),删除(removeclass),判断是否存在(hasclass),如果存在删除,如果不存在添加(toggleclass)和获取类名(getbyclass)的方法
- smarty中三种变量的访问方式
- 超详细图解:自己架设NuGet服务器
- 【C#】ContextMenuStrip 右键菜单颜色设置
- MySQL基础 - mysql命令行客户端
- php基础10:字符串中插入变量