Getting Javassist types instead of actual Hibernate entity types

10,795

Solution 1

As far as I can see the big problem that you're having is not so much the fetch type of your association, but rather that the proxied types don't work well with RequestFactory.

Yes, it could be solved by changing the fetch strategy but that sounds rather like a weak workaround that may break upon weird circumstances.

I don't remember exactly how to solve it, but I did, and as far as I remember there was an extension point in the ServiceLayerDecorator class. Basically there you check if the object you're returning is a Hibernate proxy (check Hibernate and HibernateProxy classes) and then return the non-proxy type instead in ServiceLayerDecorator. (http://code.google.com/p/google-web-toolkit/issues/detail?id=6767)

As for your fetch strategy, I'd largely recommend @BatchSize(N) where N is big (maybe 1000), but this is an independent subject.

Good luck!

Solution 2

If you call to the static method: HibernateProxyHelper.getClassWithoutInitializingProxy(entity); you get the class of the proxied entity and the class itself if it wasn't proxied.

Share:
10,795
AndaP
Author by

AndaP

web developer. gamer. dystopian fiction buff

Updated on June 18, 2022

Comments

  • AndaP
    AndaP almost 2 years

    I have stumbled upon a really annoying situation: I am using Hibernate & Spring as backend for my app and it seems that in some cases, the entities that are in a relationship with a particular entity are not fetched as normal entity objects from the DB, but as Javassist types. E.g.:

    I have the Campaign entity with the following relationships:

    @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>();
    }
    

    Upon retrieving the salesAreas connected to this Campaign, I get a list of SalesArea_$$_javassist_56, while for the dealers, I get normal Hibernate entities. Since the client part is based on GWT, we use RequestFactory for retrieving stuff. I initially thought it was a problem with the proxies, locators and so on but I have set a breakpoint in the service where these are retrieved and they are Javassist objects directly after selecting them. It seems that even removing the FetchType.LAZY annotation (although definitely not a desirable solution), the same thing happens. This happened also with other types of relationships, not only @ManyToMany.

    We are using GWT 2.3, Spring 3, Hibernate 3.6.3 and JPA 2.0 for annotations.

    Any suggestions would be appreciated.

    Thanks in advance

  • AndaP
    AndaP over 12 years
    Thanks a lot, the solution was to implement a custom ServiceLayerDecorator and override the getProperty method, as someone said in the link you sent. It works now ! :)