And*_*daP 6 java spring hibernate javassist
我偶然发现了一个非常烦人的情况:我使用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<Dealer> dealers = new ArrayList<Dealer>();
@ManyToMany
// (fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
"campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "sales_area_id", nullable = false) })
private List<SalesArea> salesAreas = new ArrayList<SalesArea>();
}
Run Code Online (Sandbox Code Playgroud)
在检索连接到此Campaign的salesAreas后,我得到SalesArea _ $$ _ javassist_56的列表,而对于经销商,我获得了正常的Hibernate实体.由于客户端部分基于GWT,我们使用RequestFactory来检索内容.我最初认为这是代理,定位器等问题,但是我在服务中设置了一个断点,在这些断点中检索这些断点,并且在选择它们之后直接将它们作为Javassist对象.看起来即使删除FetchType.LAZY注释(虽然绝对不是理想的解决方案),同样的事情也会发生.这也发生在其他类型的关系中,而不仅仅是@ManyToMany.
我们使用GWT 2.3,Spring 3,Hibernate 3.6.3和JPA 2.0进行注释.
任何建议,将不胜感激.
提前致谢
据我所知,您遇到的大问题并不是关联的获取类型,而是代理类型与 RequestFactory 不能很好地配合。
是的,可以通过改变获取策略来解决这个问题,但这听起来像是一个很弱的解决方法,可能会在奇怪的情况下崩溃。
我不记得具体是如何解决的,但我做到了,而且据我记得 ServiceLayerDecorator 类中有一个扩展点。基本上,您检查要返回的对象是否是 Hibernate 代理(检查 Hibernate 和 HibernateProxy 类),然后在 ServiceLayerDecorator 中返回非代理类型。( http://code.google.com/p/google-web-toolkit/issues/detail?id=6767 )
至于你的获取策略,我很大程度上推荐@BatchSize(N),其中N很大(可能是1000),但这是一个独立的主题。
祝你好运!
归档时间: |
|
查看次数: |
10301 次 |
最近记录: |