jpa使用manyToOne(opntional=true)踩过的坑及解决
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); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot整合@Retryable实现重试功能的示例代码
本文主要介绍了springboot整合@Retryable实现重试功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-05-05详解mybatis.generator配上最新的mysql 8.0.11的一些坑
这篇文章主要介绍了详解mybatis.generator配上最新的mysql 8.0.11的一些坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-10-10Java异常处理之try...catch...finally详解
今天小编就为大家分享一篇关于Java异常处理之try...catch...finally详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)
主要介绍用户的自动登录和取消自动登录,以及实现一天自动登录或者n天实现自动登录,当用户ip被加入到黑名单之后,直接利用过滤器返回一个警告页面。接下来通过本文给大家介绍JavaEE使用过滤器实现登录的相关知识,感兴趣的朋友一起学习吧2016-05-05
最新评论