- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个相当标准的用例,但却给我带来了非标准问题。
我有一个在服务器上运行的 Java Web 应用程序(使用 Jersey 和 Hibernate)。它有一个 AJAX API,可以从浏览器内的 Javascript 调用。
此服务将其公开给 ajax:
import list.nice.bll.UserBLL;
import list.nice.dal.dto.Token;
import list.nice.dal.dto.User;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
@Path("/users")
public class UserInfoService {
@POST
@Path("/getUser")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getUserFromLogin(JAXBElement<User> user){
User rUser = user.getValue();
rUser = UserInfoService.getActiveUser(rUser.getUserID());
return Response.status(Response.Status.OK).header("Access-Control-Allow-Origin", "*").entity(UserInfoService.getActiveUser(rUser.getUserID())).build();
}
}
我有一个与用户表相对应的用户类。每个用户都有 friend ,但我不需要加载的每个用户的 friend (不需要立即获取整个对象图)。
User.java 看起来像这样:
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name="increment", strategy = "increment")
private int userID;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "friendships", joinColumns = @JoinColumn(name="requesteruserID"), inverseJoinColumns = @JoinColumn(name="requesteduserID"))
@WhereJoinTable(clause = "accepted = 'TRUE'")
private Set<User> friends = new HashSet<User>();
public User(){}
public User(int userID, String name) {
this.userID = userID;
this.name = name;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getFriends() {
return friends;
}
public void setFriends(Set<User> friends) {
this.friends = friends;
}
当我检索活跃用户时,我想立即检索他们的所有 friend ,但不是 friend 的 friend (及其他)。所以我的 getActiveUser()
函数如下所示:
protected static User getActiveUser(int userID) {
EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager();
User user = (User) entityManager.createQuery("from User where userID = :userID").setParameter("userID", userID).getSingleResult();
user.getFriends();
//I have also tried Hibernate.initialize(user.getFriends())
entityManager.close();
return user;
}
对该函数的 Ajax 调用最终会收到 500 内部服务器错误,但服务器没有给我太多数据(并且它继续运行,就好像什么也没发生一样)。调试控制台中打印的所有内容如下:
Feb 12, 2016 1:49:13 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Feb 12, 2016 1:49:13 PM org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@6505e696
Feb 12, 2016 1:49:13 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: myapp.mypackage
...]
Feb 12, 2016 1:49:14 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Feb 12, 2016 1:49:14 PM org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@6505e696
Feb 12, 2016 1:49:14 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
但是,我认为这不是有用的信息,因为如果我将加载切换为 EAGER,它会在控制台中给出相同的消息,但工作得很好。
除此之外,我基本上完全迷失了,但为了完整起见,这是我尝试过的一件事,但也不起作用:
我决定尝试一下自定义 XMLAdapter,因为我在调试时注意到 friends
是一个 PersistentSet
,而且我认为 Jersey 可能处理得不好。
所以我像这样改变了 User 类:
@XmlJavaTypeAdapter(FriendAdapter.class)
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "friendships", joinColumns = @JoinColumn(name="requesteruserID"), inverseJoinColumns = @JoinColumn(name="requesteduserID"))
@WhereJoinTable(clause = "accepted = 'TRUE'")
private Set<User> friends = new HashSet<User>();
FriendAdapter 看起来像这样:
import org.hibernate.collection.internal.PersistentSet;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.util.*;
public class FriendAdapter extends XmlAdapter<List<User>, Set> {
@Override
public Set unmarshal(List<Friend> v) throws Exception {
return new HashSet<Friend>(v);
}
@Override
public List<Friend> marshal(Set v) throws Exception {
PersistentSet p = (PersistentSet) v;
if(p.empty()) {
return null;
}
return new ArrayList<Friend>(Arrays.asList((Friend[])v.toArray(new Friend[0])));
}
}
这给了我一个非常奇怪的结果:序列化后,进行ajax调用的Web浏览器将得到(而不是正常的对象数组)一个字符串,其内容为“myapp.mypackage.User@3c81a180 myapp.mypackage.User@28d2a9cf myapp.mypackage.User@19c74a79”
我应该怎么做才能克服这个问题?急切加载可以解决所有问题,但我不想加载 friend 的 friend 的 friend 。
最佳答案
所以,它不是世界上最好的解决方案,更具策略性地使用 XMLMappers 也可能有效,但这也同样有效。我的最终问题是 Hibernate 相对糟糕的代理系统。
我从这些其他答案中拼凑出这个解决方案,这些答案帮助我朝着正确的方向前进:
Converting Hibernate proxy to real object
为了克服 Hibernate 代理系统,我调整了我的 User 类,添加了一个别名,以便序列化程序不会尝试直接访问好友列表(因为它是一个 Hibernate 代理):
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name="increment", strategy = "increment")
private int userID;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "friendships", joinColumns = @JoinColumn(name="requesteruserID"), inverseJoinColumns = @JoinColumn(name="requesteduserID"))
@WhereJoinTable(clause = "accepted = 'TRUE'")
private Set<User> friends = new HashSet<User>();
@Transient
private Set<User> friendListSnapshot;
@Transient
private boolean friendListInitialized = false;
public User(){}
public User(int userID, String name) {
this.userID = userID;
this.name = name;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getFriends() {
return friends;
}
public void setFriends(Set<User> friends) {
this.friendsListInitialized = false;
this.friendsListSnapshot = null;
this.friends = friends;
}
public void initFriends(){
((PersistentSet)friends).forceInitialization();
this.friendsListSnapshot = ((Map<User, ?>)((PersistentSet) friends).getStoredSnapshot()).keySet();
this.friendsListInitialized = true;
}
}
如果有人知道为什么 PersistentSet 在 EagerLoaded 时可以序列化,但在 LazyLoaded 时则不能序列化,然后强制初始化,请插话。
关于java - 序列化 LazyLoaded Hibernate 表导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371443/
我怎样才能让 Reacts Suspense 不显示任何回退而是保持在同一页面上这就是我的 return (
我正在使用lazyload jQuery 插件。 它工作正常,除了一个问题:在滚动之前,图像 src 不会被交换为原始数据。一旦你滚动,即使是一点点,图像也会加载 - 但我需要它们在页面准备好时立即加
jQuery LazyLoad 不会在打开页面的可见部分加载图像,直到我滚动页面(即使是 1px)。 当我滚动页面时,一切正常 更新: CoffeeScript jQuery -> $("img
我收到错误,lazyload 不是函数 但是在调用该函数之前加载了 jquery 和lazyload。我查了一下,只加载了一个jQuery。加载的顺序是有效的。 http://meny.astadvi
我无法想象这是如何开始发生的,几个月来一直运行良好...... http://www.lizhess.com/shop/ 在 chrome/ff 中观察您的网络选项卡 - 它在页面上一秒钟后加载 25
我有一个网页,上面有很多图像。这些图像中的大部分都位于 slider 内,使用 SlickSlider.js 和 Lazyload。 该页面的加载时间为 3.87 秒,但发出了超过 134 个请求。查
我目前正在开发一个应用程序,它有一个使用 LazyLoader 方法填充的列表,所以我有以下类: 文件缓存.java,ImageLoader.java,LazyAdapter.java,工具.java
我有一个 Query 对象,它最初配置为 lazyload() 模型上的所有关系: query = session.query(Article).options(lazyload('author'))
我正在使用保罗爱尔兰的无限卷轴 http://masonry.desandro.com/demos/infinite-scroll.html以及 Mike Tupupola 的延迟加载 jquery
我有一个实体映射,其中有三个标记为延迟加载的属性。我的期望是,当我访问单个属性(即缩略图)时,只会加载该属性的数据。但是,如果访问这些属性中的任何一个,NHibernate 似乎将加载所有标记为 La
我正在使用lazyload.js 库来延迟加载动态加载到无限 ScrollView 中的图像。当我开始滚动并加载下一页结果后,延迟加载工作得很好。 初始加载时,图像不会延迟加载,直到窗口中发生某些操作
我使用 Mootools 库开发了一个 JS 密集型网站,但在路上遇到了障碍。页面上有一个滚动 div,其中包含 500 多个图像,我正在尝试实现延迟加载功能,因此页面不会一次加载所有 500 多个图
需要有关在刷新、加载、排序、分页页面时选择 primefaces 数据表第一行的正确方法的帮助
您好,我想了解 sqlalchemy 延迟加载是如何工作的?假设我有这个查询 results = ( session.query(Parent). option
有人知道为什么我的延迟加载似乎不起作用吗? 我完全从延迟加载页面复制,甚至使用它们的图像作为测试,它们只是正常加载而不是淡入淡出......? lazy link example 然后我放入了一个无冲
因此,所有代码都运行良好。查询一个数据库,节点/父 ID 被懒惰地传递给 jsTree,并且,如果在搜索栏中键入一个术语——类似的过程继续进行,但传递给 jsTree 的节点是由另一个 SQL 查询返
我在网页的某个部分对图像使用延迟加载 功能。 (基本上,当前显示在 viewport 中的图像是获取的。其余的不是从服务器获取的。)以下 JavaScript 有效。 用法示例:img class="
正在从事一个使用 Spring/JPA/Rest 的项目。我们有一个类,它有一个 @OneToMany 字段(在下面的例子中说 Student ),它被标记为延迟加载。然而,当我们在 postman
我一直在开发一个单页应用程序,现在它已经变得非常庞大。我从 Require JS 和 AngularJS 开始,但是组件太多,加载单个页面会向服务器发出大约 40-50 个请求(包括模板文件)。 即使
我正在使用 VVO 的延迟加载 http://vvo.github.io/lazyload/很长一段时间以来,但对于这个特定页面,我不知道出了什么问题。它在页面加载时加载所有图像,这些图像应该是延迟加
我是一名优秀的程序员,十分优秀!