我已经通过net上的hibernate获取策略的一些链接.我喜欢的一个简短而简洁的链接是 http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/.我们有四种类型的获取策略.这些是 :-
我的第一个问题是上述哪一个符合eager或lazyloading fetch类型的资格?
为了提出我对hibernate获取策略的疑问,我正在考虑在我的Department类中的下面的代码片段
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@Fetch(value = FetchMode.SELECT)
@BatchSize(size = 10)
private Set<EmployeeData> employees = new HashSet<EmployeeData>();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,一旦我提到fetchtype为eager,我只留下了连接获取策略但是当我提到fetchtype作为lazyloading时,我还有其他三个选项,即select,batch-size和subselect.同意?现在,如果我在我的遗留项目中查看代码片段,它会将提取类型称为渴望和获取策略,因为select会相互冲突.对?
另一个问题是我在编写FetchMode时看不到批量大小选项.虽然我看到其他三种获取策略,但是在eclipse中控制+空间?
跟着我的课程
public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {
User user;
GetUserCallback userCallBack;
public fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
this.user = user;
this.userCallBack = userCallBack;
}
@Override
protected User doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams,
CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams,
CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS
+ "FetchUserData.php");
User returnedUser = null;
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity(); …Run Code Online (Sandbox Code Playgroud) 我有一些类User与LoginSession类有一对多的关系(我的User类中有一个LoginSessions集合).
@Entity(name="T_User")
public class User()
{
....
@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JsonIgnore
private Set<LoginSession> userLoginSession;
....
}
Run Code Online (Sandbox Code Playgroud)
这是LoginSession类:
@Entity(name="T_LoginSession")
public class LoginSession extends BasicDTO
{
@ManyToOne
@JoinColumn(name="userId")
protected User user;
...
Run Code Online (Sandbox Code Playgroud)
我有这个标准:
Criteria crit = session.createCriteria(User.class);
crit.setFetchMode("loginSession", FetchMode.JOIN);
crit.createAlias("userLoginSession", "session");
crit.add(Restrictions.eq("session.token", sessionToken));
crit.setMaxResults(1);
crit.setFirstResult(0);
crit.setFetchSize(1);
Run Code Online (Sandbox Code Playgroud)
问题是提取始终是懒惰的.如何让它成为Eager(通过标准而不是通过属性注释)?
注意:
如果我在@Fetch注释private Set<LoginSession> userLoginSession中设置的响应提取之上添加注释(我不会按标准自定义setFetchMode).
字段的名称(方法的第一个参数setFetchMode)是否正确?
问题: 这个错误与我的问题有关吗?
我想现在Hibernate中CascadeType和FetchType有什么区别?
它们看起来非常相似,但我想它们不可互换,对吧?什么时候使用它们?它们可以同时使用吗?