Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Javassist类型而不是实际的Hibernate实体类型_Java_Hibernate_Spring_Javassist - Fatal编程技术网

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

获取Javassist类型而不是实际的Hibernate实体类型,java,hibernate,spring,javassist,Java,Hibernate,Spring,Javassist,我偶然发现了一个非常恼人的情况:我使用Hibernate&Spring作为我的应用程序的后端,在某些情况下,与特定实体有关系的实体不是作为普通实体对象从DB中获取的,而是作为Javassist类型获取的。例如: 我拥有具有以下关系的活动实体: @Entity @Table(name = "campaign") public class Campaign implements Serializable { [..] @ManyToMany(fetch = FetchType.LAZY)

我偶然发现了一个非常恼人的情况:我使用Hibernate&Spring作为我的应用程序的后端,在某些情况下,与特定实体有关系的实体不是作为普通实体对象从DB中获取的,而是作为Javassist类型获取的。例如:

我拥有具有以下关系的活动实体:

@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>();
}
@实体
@表(name=“活动”)
公共类活动实现可序列化{
[..]
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(uniqueConstraints=@UniqueConstraint(columnNames={
“活动标识”、“经销商标识”},name=“活动标识有经销商”,joinColumns={@JoinColumn(name=“活动标识”,nullable=false)},inverseJoinColumns={@JoinColumn(name=“经销商标识”,nullable=false)})
私有列表交易商=新的ArrayList();
@许多
//(fetch=FetchType.LAZY)
@JoinTable(uniqueConstraints=@UniqueConstraint(columnNames={
“campaign_id”、“sales_area_id”}),name=“campaign_拥有_sales_area”,joinColumns={@JoinColumn(name=“campaign_id”,nullable=false)},inverseJoinColumns={@JoinColumn(name=“sales_area_id”,nullable=false)})
private List salesAreas=new ArrayList();
}
在检索连接到此活动的SalesArea时,我会得到一个SalesArea_$$$\uJavassist_56的列表,而对于经销商,我会得到正常的Hibernate实体。由于客户端部分基于GWT,因此我们使用RequestFactory来检索内容。我最初认为代理、定位器等有问题,但我在服务中设置了一个断点,在选择它们之后,它们就直接成为Javassist对象。看起来,即使删除FetchType.LAZY注释(尽管肯定不是理想的解决方案),也会发生同样的事情。这也发生在其他类型的关系中,不仅仅是@manytomy

我们使用GWT2.3、Spring3、Hibernate3.6.3和JPA2.0进行注释

如有任何建议,将不胜感激


提前感谢

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

是的,这可以通过改变fetch策略来解决,但这听起来像是一个薄弱的解决方法,可能会在奇怪的情况下中断

我不记得到底该如何解决它,但我记得,就我所记得的,ServiceLayerCorator类中有一个扩展点。基本上,在这里检查返回的对象是否是Hibernate代理(检查Hibernate和HibernateProxy类),然后在ServiceLayerCorator中返回非代理类型。()

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


祝你好运

使用Hibernate的代理模型,现在使用Javassist来帮助避免较慢的传统Hibernate运行时反射操作,事情将永远不会像使用JDO实现(如DataNucleus)等完整字节码增强解决方案的人享受的干净、直观的体验那样优雅

就我个人而言,我永远看不到坚持(请原谅双关语)解决方案的意义,因为这些解决方案会导致如此多的问题,并在网络上充斥着关于坏代码的问题,这些问题需要奇怪的、不直观的解决方法,但人们仍然这样做


然而,回到问题上来:如果您使用JPA,您的问题的一个解决方案是使用DataNucleus/JPA,这带来了DataNucleus/JDO(干净的底层实现——没有代理,没有Javassist类等)的许多好处在符合JPA的实现中-即,您无需更改现有源代码即可开始使用它。

如果您调用静态方法: HibernateProxy Helper.getClassWithoutInitializingProxy(实体);
您可以获得被代理实体的类以及未被代理的类本身。

FetchType.LAZY是JPA的默认值。删除它没有任何作用,除非您指定FetchType.EAGER。非常感谢,解决方案是实现自定义ServiceLayerCorator并重写getProperty方法,正如您发送的链接中所述。现在可以了!:)