获取Javassist类型而不是实际的Hibernate实体类型

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进行注释.

任何建议,将不胜感激.

提前致谢

nin*_*ser 4

据我所知,您遇到的大问题并不是关联的获取类型,而是代理类型与 RequestFactory 不能很好地配合。

是的,可以通过改变获取策略来解决这个问题,但这听起来像是一个很弱的解决方法,可能会在奇怪的情况下崩溃。

我不记得具体是如何解决的,但我做到了,而且据我记得 ServiceLayerDecorator 类中有一个扩展点。基本上,您检查要返回的对象是否是 Hibernate 代理(检查 Hibernate 和 HibernateProxy 类),然后在 ServiceLayerDecorator 中返回非代理类型。( http://code.google.com/p/google-web-toolkit/issues/detail?id=6767 )

至于你的获取策略,我很大程度上推荐@BatchSize(N),其中N很大(可能是1000),但这是一个独立的主题。

祝你好运!