Spring Roo doesn't add FetchType.LAZY for fields in .aj files, Should I do it manually?

情到浓时终转凉″ 提交于 2019-12-11 18:38:22

问题


These are a couple of question, should Spring Roo through reverse engineering adding FetchType.LAZY for Set fields in .aj files or should I do it manually?

If FetchType.LAZY is not present at .aj files, I could make it through the queries " SELECT st1 FROM parentTable t1 JOIN FETCH t1.childTable st1" into the select, right ?

The point here is that I can add FetchType.LAZY to the files manually (Refactor .aj file > Push In..) and then on .java file (high risk if I want Roo to keep the control on my domain classes).

About to make it through queries, I can't do this because I'm getting:

> query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=ii,role=...domain.Industry.i18nIndustries,
tableName=..I18nIndustry,
tableAlias=i18nindust3_,
origin=..Industry industry2_,
columns={industry2_.IdIndustry ,className=..domain.I18nIndustry}}] 
[select u.idUserName, u.isActiveInd, u.employeeNbr, u.name, c.name as CompanyName, ii.name as IndustryName from Users u JOIN u.idCompany c JOIN c.idIndustry i JOIN FETCH i.i18nIndustries ii WHERE u.idUserName = :username ]

Here the .aj files generated by Roo:

privileged aspect Users_Roo_DbManaged {
...    
@ManyToOne
@JoinColumn(name = "IdCompany", referencedColumnName = "IdCompany", nullable = false)
private Company Users.idCompany;  ...

..

privileged aspect Company_Roo_DbManaged {
...
@ManyToOne
@JoinColumn(name = "IdCity", referencedColumnName = "IdCity", nullable = false)
private City Company.idCity;

@ManyToOne
@JoinColumn(name = "IdIndustry", referencedColumnName = "IdIndustry", nullable = false)
private Industry Company.idIndustry; ..

..

    privileged aspect Industry_Roo_DbManaged {    ..
@OneToMany(mappedBy = "idIndustry")
private Set<I18nIndustry> Industry.i18nIndustries; ...

Can you please give me a clue, about what is happening here ?

Spring MVC 3.2, Roo 1.2.4, MSSql database

Thanks folks! --JR


回答1:


About

These are a couple of question, should Spring Roo through reverse engineering adding FetchType.LAZY for Set fields in .aj files or should I do it manually?

This is not needed because this is the default for this kind of relationship (see https://stackoverflow.com/a/13765381/2295657).

If FetchType.LAZY is not present at .aj files, I could make it through the queries " SELECT st1 FROM parentTable t1 JOIN FETCH t1.childTable st1" into the select, right ?

This makes a eager loading of the relationship data. I think you are in a mistake about the meaning of LAZY and EAGER modes:

  • EAGER: Requires to load value when instance is loaded into memory (default for basic and no-collections-relationship properties)
  • LAZY: when instance is loaded a proxy is stored in property and, when anything tries to get data, loads it form DB (default for collections-relationship properties)

On the other hand, to load a LAZY property requires a DB Connection alive when anything tries to get the data, so, you must execute this code inside a no-static, @Transactional annotated, method (read @Transactional JavaDoc for more info).

I advice you to make a look in the JPA specification. In my experience, I so useful.




回答2:


I found whats happening, This is your HQL

[select u.idUserName, u.isActiveInd, u.employeeNbr, u.name, c.name as CompanyName, ii.name as IndustryName from Users u JOIN u.idCompany c JOIN c.idIndustry i JOIN FETCH i.i18nIndustries ii WHERE u.idUserName = :username ]

What i understand from this hql is u want to fetch list of i18nIndustries ii along with that perticuler idIndustry i correct?

But when you use JOIN FETCH on any object you have to select the main object to hold child object, in your case main object is idIndustry. JOIN FETCH i.i18nIndustries ii means "when fetching idIndustry, also fetch the i18nIndustries, linked to the idIndustry". But your query doesn't fetch idIndustry So the fetch makes no sense.

In select either u have to fetch i also so that the owner (i) of the fetched association (i.i18nIndustries ii) will present in the select list. as your error is

query specified join fetching, but the owner of the fetched association was not present in the select list

or remove JOIN FETCH just use JOIN

So keeping in mind u want list of i18nIndustries ii, Your query will become :(added i in select)

select u.idUserName, u.isActiveInd, u.employeeNbr, u.name, c.name as CompanyName, i,ii.name as IndustryName from Users u JOIN u.idCompany c JOIN c.idIndustry i JOIN FETCH i.i18nIndustries ii WHERE u.idUserName = :username



来源:https://stackoverflow.com/questions/24479665/spring-roo-doesnt-add-fetchtype-lazy-for-fields-in-aj-files-should-i-do-it-ma

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!