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

网友投稿 1137 2022-12-01

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

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 属性实际上指定关联类与被关联类的joiGrTiGin 查询关系,如optional=false 时join 查询关系为inner joinhttp://, optional=true 时join 查询关系为left join。

但是实际运行中,语句一直为innerjoin 设置为optional=true不起作用

原因

dc.createAlias("org", "org"); 本来写在User user = UserUtils.getUser(); 下面,如果去掉则是正确的

public Page find(Page page, Site siteMain) {

DetachedCriteria dc = siteMainDao.createDetachedCriteria();

// 判断是否是主站、超级管理员

User user = UserUtils.getUser();

return siteMainDao.find(page, dc);

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:qml截图方法二
下一篇:StackLayout的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~