昨天朋友面试遇到的问题,实体类中,懒加载的属性怎么在controller中获取啊?

Mr906 2019-02-15 09:13:58

public class Person {
@Id
@GeneratedValue
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
private List<Role> roles ;


}
//这是一个PersonRepsitory
public interface PersonRepsitory extends JpaRepository<Person.Long>{}
//在controller当中如何才能在getPerson函数中取出某个Person的Role的数据
@Controller
@RequestMapping("/")
public class PersonController{
@Autowired
PersonRepsitory personRepsitory;
@RequestMapping("/")
public @ResponseBody Person getPerson(){
return person;
}
}
...全文
850 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr906 2019-02-21
  • 打赏
  • 举报
回复
统一回复不好意思各位,我不是故意的点错了。我以为是平均分配点数
yn_leopard 2019-02-19
  • 打赏
  • 举报
回复
感觉面试官问的是OpenSessionView的使用方式。
hibernate 允许 延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。

这里就需要配置OpenSessionInViewFilter ,使得懒加载的属性在controller中得以获取
亲爱的Joe 2019-02-19
  • 打赏
  • 举报
回复
引用 12 楼 Mr906 的回复:
[quote=引用 9 楼 亲爱的Joe 的回复:]
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题[/quote]
FetchType.LAZY
是懒汉式,第一次请求的时候才会获取,
FetchType.EAGER)
是饿汉式,不管是不是调用,都会第一时间加载,第一次调用的时候,数据已经加载完毕
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 14 楼 Yaphets丶混世大魔王 的回复:
引用 13 楼 Mr906 的回复:
[quote=引用 11 楼 Yaphets丶混世大魔王 的回复:]
最简单的就是调用一下get方法,就会加载,你需要那些熟悉,你就调用一下对象的get方法,不需要的不调用,那么返回给前端的就是你想要的。懒加载的意思就是你不主动调用get方法,就不会去数据库获取。
我是这么回答的,但是面试官说不正确。它给我列举了两种方法,回来找不到,估计是我没听清。。。。

估计是问的设计模式里面的懒加载的两种实现吧,你可以去看看[/quote]
好,谢谢~我去看一下
  • 打赏
  • 举报
回复
引用 13 楼 Mr906 的回复:
引用 11 楼 Yaphets丶混世大魔王 的回复:
最简单的就是调用一下get方法,就会加载,你需要那些熟悉,你就调用一下对象的get方法,不需要的不调用,那么返回给前端的就是你想要的。懒加载的意思就是你不主动调用get方法,就不会去数据库获取。
我是这么回答的,但是面试官说不正确。它给我列举了两种方法,回来找不到,估计是我没听清。。。。
估计是问的设计模式里面的懒加载的两种实现吧,你可以去看看
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 11 楼 Yaphets丶混世大魔王 的回复:
最简单的就是调用一下get方法,就会加载,你需要那些熟悉,你就调用一下对象的get方法,不需要的不调用,那么返回给前端的就是你想要的。懒加载的意思就是你不主动调用get方法,就不会去数据库获取。
我是这么回答的,但是面试官说不正确。它给我列举了两种方法,回来找不到,估计是我没听清。。。。
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 9 楼 亲爱的Joe 的回复:
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 21 楼 亲爱的Joe 的回复:
[quote=引用 20 楼 亲爱的Joe 的回复:]
[quote=引用 18 楼 Mr906 的回复:]
[quote=引用 16 楼 亲爱的Joe 的回复:]
[quote=引用 12 楼 Mr906 的回复:]
[quote=引用 9 楼 亲爱的Joe 的回复:]
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题[/quote]
FetchType.LAZY
是懒汉式,第一次请求的时候才会获取,
FetchType.EAGER)
是饿汉式,不管是不是调用,都会第一时间加载,第一次调用的时候,数据已经加载完毕[/quote]
这个是jpa的注解嘛?我原来没有接触过。能不能仔细讲一些谢谢老哥~[/quote]
我不是很了解,只是记得有这么一个属性的,然而没有经过验证。同时看别人的回答,我感觉我好像回答的有点文不对题。

以下是我推断,没有经过验证:
这两个属性,懒加载是加载实体的时候不会从数据库获取该属性内容。而饿加载注解,在业务bean加载的时候就会获取到该属性的值。[/quote]
很惭愧,之前回答你的时候是不太确定有Eager属性的,只是凭感觉应该有这个属性,刚才查了查才确定真有。
你可以自己搜下“FetchType.LAZY和FetchType.EAGER什么区别”,资料还不少呢[/quote]
OK!我下班之后回去看一下,楼上那个老哥说是Hibernate的一个使用方法
亲爱的Joe 2019-02-19
  • 打赏
  • 举报
回复
引用 20 楼 亲爱的Joe 的回复:
[quote=引用 18 楼 Mr906 的回复:]
[quote=引用 16 楼 亲爱的Joe 的回复:]
[quote=引用 12 楼 Mr906 的回复:]
[quote=引用 9 楼 亲爱的Joe 的回复:]
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题[/quote]
FetchType.LAZY
是懒汉式,第一次请求的时候才会获取,
FetchType.EAGER)
是饿汉式,不管是不是调用,都会第一时间加载,第一次调用的时候,数据已经加载完毕[/quote]
这个是jpa的注解嘛?我原来没有接触过。能不能仔细讲一些谢谢老哥~[/quote]
我不是很了解,只是记得有这么一个属性的,然而没有经过验证。同时看别人的回答,我感觉我好像回答的有点文不对题。

以下是我推断,没有经过验证:
这两个属性,懒加载是加载实体的时候不会从数据库获取该属性内容。而饿加载注解,在业务bean加载的时候就会获取到该属性的值。[/quote]
很惭愧,之前回答你的时候是不太确定有Eager属性的,只是凭感觉应该有这个属性,刚才查了查才确定真有。
你可以自己搜下“FetchType.LAZY和FetchType.EAGER什么区别”,资料还不少呢
亲爱的Joe 2019-02-19
  • 打赏
  • 举报
回复
引用 18 楼 Mr906 的回复:
[quote=引用 16 楼 亲爱的Joe 的回复:]
[quote=引用 12 楼 Mr906 的回复:]
[quote=引用 9 楼 亲爱的Joe 的回复:]
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题[/quote]
FetchType.LAZY
是懒汉式,第一次请求的时候才会获取,
FetchType.EAGER)
是饿汉式,不管是不是调用,都会第一时间加载,第一次调用的时候,数据已经加载完毕[/quote]
这个是jpa的注解嘛?我原来没有接触过。能不能仔细讲一些谢谢老哥~[/quote]
我不是很了解,只是记得有这么一个属性的,然而没有经过验证。同时看别人的回答,我感觉我好像回答的有点文不对题。

以下是我推断,没有经过验证:
这两个属性,懒加载是加载实体的时候不会从数据库获取该属性内容。而饿加载注解,在业务bean加载的时候就会获取到该属性的值。
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 17 楼 yn_leopard 的回复:
感觉面试官问的是OpenSessionView的使用方式。
hibernate 允许 延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。

这里就需要配置OpenSessionInViewFilter ,使得懒加载的属性在controller中得以获取
是这样啊!谢谢老哥。hibernate还有着用用处。我晚上回去仔细看看,hibernate的文章
Mr906 2019-02-19
  • 打赏
  • 举报
回复
引用 16 楼 亲爱的Joe 的回复:
[quote=引用 12 楼 Mr906 的回复:]
[quote=引用 9 楼 亲爱的Joe 的回复:]
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
这个是什么意思,我这个是面试提上的问题[/quote]
FetchType.LAZY
是懒汉式,第一次请求的时候才会获取,
FetchType.EAGER)
是饿汉式,不管是不是调用,都会第一时间加载,第一次调用的时候,数据已经加载完毕[/quote]
这个是jpa的注解嘛?我原来没有接触过。能不能仔细讲一些谢谢老哥~
亲爱的Joe 2019-02-18
  • 打赏
  • 举报
回复
roles属性的注解改成

@ManyToMany(fetch = FetchType.EAGER)可以么
  • 打赏
  • 举报
回复
最简单的就是调用一下get方法,就会加载,你需要那些熟悉,你就调用一下对象的get方法,不需要的不调用,那么返回给前端的就是你想要的。懒加载的意思就是你不主动调用get方法,就不会去数据库获取。
sjlzcj 2019-02-18
  • 打赏
  • 举报
回复
JPA懒加载,即在使用的时候才从数据库中获取数据,对象查询的时候返回的只是代理属性。在controller中获取懒加载属性,只要把事物配置到controller层即可,但不建议这样去做。且congtroller层不建议有任何业务相关代码,即需要的懒加载数据依然需要业务需求,应在service层加载完毕。至于所谓的自定义jPA也是不建议的,那和直接写个JDBC联库查询没什么本质区别,已经破坏了各层职能
stacksoverflow 2019-02-15
  • 打赏
  • 举报
回复
一般情况下: 首先,数据库的connection是在service中管理的,所以service可以控制事务的提交。 对数据库实体类的懒加载,也就是在使用的时候再去数据查数据。 如果使用的地方在service之外,比如controller,那数据的connection就得不到了。 所以,不建议在service以外使用懒加载。 或者说根本不建议使用懒加载, 或者说不建议对数据库的实体类做代理,因为被代理的实体类在编程的过程中会逃到哪里很难控制,甚至会逃到页面上,而对这种代理类的操作好多人自己都不知道在操作什么,风险太大。
qybao 2019-02-15
  • 打赏
  • 举报
回复
person没有提供getRoles方法?
Mr906 2019-02-15
  • 打赏
  • 举报
回复
引用 6 楼 stacksoverflow 的回复:
[quote=引用 4 楼 Mr906 的回复:]
[quote=引用 2 楼 stacksoverflow 的回复:]
一般情况下:
首先,数据库的connection是在service中管理的,所以service可以控制事务的提交。
对数据库实体类的懒加载,也就是在使用的时候再去数据查数据。
如果使用的地方在service之外,比如controller,那数据的connection就得不到了。
所以,不建议在service以外使用懒加载。
或者说根本不建议使用懒加载,
或者说不建议对数据库的实体类做代理,因为被代理的实体类在编程的过程中会逃到哪里很难控制,甚至会逃到页面上,而对这种代理类的操作好多人自己都不知道在操作什么,风险太大。

这个不是我代码中遇到的问题,是面试官出的题目。[/quote]
你也可以这么回复他,不建议这么做。[/quote]
那理由就是你上面说的被。但是这个好像是jpa操作还是啥。
Mr906 2019-02-15
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
有getRoles方法就好办了,你调用person.getRoles().size()就可以了
延时加载就是你用到的时候才会加载,你调用person.getRoles()还是没用用到它,所以你再调用一下size()或List的其他方法就可以了
听他说有两种方式一种是什么利用事务操作。另一种时利用自定义JPA操作。
stacksoverflow 2019-02-15
  • 打赏
  • 举报
回复
引用 4 楼 Mr906 的回复:
[quote=引用 2 楼 stacksoverflow 的回复:] 一般情况下: 首先,数据库的connection是在service中管理的,所以service可以控制事务的提交。 对数据库实体类的懒加载,也就是在使用的时候再去数据查数据。 如果使用的地方在service之外,比如controller,那数据的connection就得不到了。 所以,不建议在service以外使用懒加载。 或者说根本不建议使用懒加载, 或者说不建议对数据库的实体类做代理,因为被代理的实体类在编程的过程中会逃到哪里很难控制,甚至会逃到页面上,而对这种代理类的操作好多人自己都不知道在操作什么,风险太大。
这个不是我代码中遇到的问题,是面试官出的题目。[/quote] 你也可以这么回复他,不建议这么做。
加载更多回复(3)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧