我偶然发现了一个非常烦人的情况:我正在使用Hibernate& Spring作为我的应用程序的后端,似乎在某些情况下,与特定实体关系的实体不会从DB中获取为普通实体对象,而是作为Javassist类型.例如.:
我的Campaign实体具有以下关系:
@Entity
@Table(name = "campaign")
public class Campaign implements Serializable {
[..]
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
"campaign_id","dealer_id" }),name = "campaign_has_dealer",joinColumns = { @JoinColumn(name = "campaign_id",nullable = false) },inverseJoinColumns = { @JoinColumn(name = "dealer_id",nullable = false) })
private List
在检索连接到此Campaign的salesAreas后,我得到SalesArea _ $$_ javassist_56的列表,而对于经销商,我获得了正常的Hibernate实体.由于客户端部分基于GWT,我们使用RequestFactory来检索内容.我最初认为这是代理,定位器等问题,但是我在服务中设置了一个断点,在这些断点中检索这些断点,并且在选择它们之后直接将它们作为Javassist对象.看起来即使删除FetchType.LAZY注释(虽然绝对不是理想的解决方案),同样的事情也会发生.这也发生在其他类型的关系中,而不仅仅是@ManyToMany.
我们使用GWT 2.3,Spring 3,Hibernate 3.6.3和JPA 2.0进行注释.
任何建议,将不胜感激.
提前致谢
是的,它可以通过改变获取策略来解决,但这听起来像一个弱的解决方法,可能会破坏奇怪的情况.
我不记得究竟如何解决它,但我做到了,据我所知,ServiceLayerDecorator类中有一个扩展点.基本上你检查你要返回的对象是否是Hibernate代理(检查Hibernate和HibernateProxy类),然后在ServiceLayerDecorator中返回非代理类型. (http://code.google.com/p/google-web-toolkit/issues/detail?id=6767)
至于你的获取策略,我主要推荐@BatchSize(N),其中N很大(可能是1000),但这是一个独立的主题.
祝好运!