jpa使用manyToOne(opntional=true)踩过的坑及解决

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jpa使⽤manyToOne(opntional=true)踩过的坑及解决⽬录
jpa使⽤manyToOne(opntional=true)踩坑
@ManyToOne⽤于⼀对多的情况
@manytoone设置为optional=true不起作⽤
@manytoone
原因
jpa使⽤manyToOne(opntional=true)踩坑
@ManyToOne⽤于⼀对多的情况
(默认情况下是懒加载的,没必要去配置哦)如:⼀个account可以对应多个accountPrivilege
@Entity
@Table(name = ACCOUNT_PRIVILEGE)
public class AccountPrivilege extends EntityId {
// 账号
@ManyToOne(optional = false)
@JoinColumn(name = ACCOUNT_PRIVILEGE_ACCOUNT, nullable = false)
private Account account;
}
但是加上@ManyToOne(optional=false)出现了⼀些问题。

jpa将数据库那个字段默认置为0,在查询时,数据库找不到account.id=0的记录!!
通过查阅⼀些资料,发现:
optional属性是定义该关联类是否必须存在,值为false 时,关联类双⽅都必须存在,如果关系被维护端不存在,查询的结果为null。

值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。

optional属性的默认值是true。

optional 属性实际上指定关联类与被关联类的join 查询关系,如optional=false 时join 查询关系为inner join, optional=true 时join 查询关系为left join。

在我们不保证该字段关联的记录⼀定存在的情况下,使⽤@ManyToOne或@ManyToOne(optional=true)是⽐较⽅便的。

在我把@ManyToOne(optional=false)改为@ManyToOne后,jpa将数据库那个字段默认置为null。

@manytoone设置为optional=true不起作⽤
@manytoone
optional属性的默认值是true。

optional 属性实际上指定关联类与被关联类的join 查询关系,如optional=false 时join 查询关系为inner join, optional=true 时join 查询关系为left join。

但是实际运⾏中,语句⼀直为innerjoin 设置为optional=true不起作⽤
原因
dc.createAlias("org", "org"); 本来写在User user = UserUtils.getUser(); 下⾯,如果去掉则是正确的
public Page<Site> find(Page<Site> page, Site siteMain) {
DetachedCriteria dc = siteMainDao.createDetachedCriteria();
// 判断是否是主站、超级管理员
User user = UserUtils.getUser();
return siteMainDao.find(page, dc);
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

相关文档
最新文档