对于一个答案向下滚动到这个结尾… 基本的问题和多次询问一样。 我有一个简单的程序,有两个POJO事件和用户 – 用户可以有多个事件。 @Entity @Table public class Event { private Long id; private String name; private User user; @Column @Id @GeneratedValue public Long getId() {return id;} public void setId(Long id) { this.id = id; } @Column public String getName() {return name;} public void setName(String name) {this.name = name;} @ManyToOne @JoinColumn(name="user_id") public User getUser() […]
我有一个从外部代码获取JPA实体的服务。 在这个服务中,我想遍历一个延迟加载的集合,它是这个实体的一个属性,以查看客户端是否在数据库中添加了一些相对于当前版本的东西。 但是,客户可能从来没有碰过这个集合,所以它还没有被初始化。 这导致众所周知的 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.SomeEntity. 当然,如果客户从未触摸收集,我的服务不必检查可能的更改。 问题是,我似乎无法find一种方法来testing集合是否被初始化。 我想我可以调用size() ,如果它抛出LazyInitializationException我会知道,但我试图不依赖于这种模式。 有什么isInitialized()方法吗?
我拥有的: @Entity public class MyEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Address> addreses; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Person> persons; //…. } public void handle() { Session session = createNewSession(); MyEntity entity = (MyEntity) session.get(MyEntity.class, entityId); proceed(session); // FLUSH, […]
我的程序从左到右显示一个用UIImageViews平铺的水平滚动表面。 代码在UI线程上运行,以确保新显示的UIImageView具有分配给它们的新鲜加载的UIImage。 加载发生在后台线程上。 一切工作几乎没有问题,除了有一个口吃每个图像变得可见。 起初我以为我的后台工作人员在UI线程中locking了一些东西。 我花了很多时间看它,并最终意识到,UIImage在UI线程上进行一些额外的惰性处理时,它首先变得可见。 这让我很困惑,因为我的工作线程有明确的代码来解压缩JPEG数据。 无论如何,在预感上,我写了一些代码在后台线程中渲染成一个临时的graphics上下文,果然,口吃消失了。 UIImage现在被预先加载在我的工作线程上。 到现在为止还挺好。 问题是我的新的“强制延迟加载图像”方法是不可靠的。 它会导致间歇性的EXC_BAD_ACCESS。 我不知道UIImage究竟在幕后做了些什么。 也许是解压缩JPEG数据。 无论如何,这个方法是: + (void)forceLazyLoadOfImage: (UIImage*)image { CGImageRef imgRef = image.CGImage; CGFloat currentWidth = CGImageGetWidth(imgRef); CGFloat currentHeight = CGImageGetHeight(imgRef); CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); CGAffineTransform transform = CGAffineTransformIdentity; CGFloat scaleRatioX = bounds.size.width / currentWidth; CGFloat scaleRatioY = bounds.size.height / currentHeight; UIGraphicsBeginImageContext(bounds.size); […]
在Hibernate会话期间,我正在加载一些对象,其中一些由于延迟加载而被加载为代理。 一切正常,我不想closures延迟加载。 但后来我需要通过RPC将一些对象(实际上是一个对象)发送到GWT客户端。 碰巧这个具体的对象是一个代理。 所以我需要把它变成真正的对象。 在Hibernate中我找不到像“实现”的方法。 我怎样才能把代理的一些对象变成知道他们的类和ID的实体? 目前唯一的解决scheme是从Hibernate的caching中清除对象并重新加载它,但是由于很多原因它确实很糟糕。
你用什么样的替代策略来避免LazyLoadExceptions? 我明白,公开会议有问题: 分层的应用程序运行在不同的jvm中 事务只在最后被提交,而且很可能你会喜欢之前的结果。 但是,如果您知道您的应用程序正在单个虚拟机上运行,那么为什么不通过在视图策略中使用公开会话来缓解您的痛苦呢?