How to convert javassist instance into instance of a specific domain

泄露秘密 提交于 2019-12-08 02:14:51

问题


I would like to intersect two lists of instances of a specific domain class using grails 1.3.7.

The problem is, that the instances of one list are created by javasisst so that the result of the intersection is always an empty list.

Here are my domains:

class User {
    ...
    static hasMany = [foos : Foo]
    ...
} 

class Foo {
    ...
    static hasMany = [bars : Bar]
    ...
}

class Bar {
    ...
    static hasMany = [localizedTitles : LocalizedTitle]
    ...
}

I get the list of all Bar instances of the user like this:

def allBarsOfUser = userInstance.foos.bars.flatten()

And try to intersect with another list of Bar instances:

def intersectedBars = bars.intersect(allBarsOfUser)

The problem is, that the type of elements of allBarsOfUser ist Bar_$$_javassist_139 and the the type of the elememts of bars is Bar so that intersectedBars is always [].

I solved my problem by doing the following - but I don't like the solution:

def allBarsOfUser = userInstance.foos.bars.flatten().collect{Bar.get(it.id)}

What would be a better solution?

How could I cast Bar_$$_javassist_139 to Bar so that intersect() works fine?


回答1:


It depends what you're actually trying to do. The intersect method ultimately relies on equals, so if you implement equals and hashCode in Bar then it will do what you want. But you shouldn't generally implement equals in terms of the object ID, as IDs are only assigned when an object is saved so you wouldn't be able to compare a newly-created object with a previously-saved one. Hibernate recommends that you implement it based on a business key (something that isn't the generated ID but which is stable and unlikely to change throughout the lifetime of the object)

class UserAccount {
  String username
  String realname

  public boolean equals(that) {
    return ((that instanceof UserAccount)
        && (this.username == that.username))
  }

  public int hashCode() {
    username.hashCode()
  }
}

So if you do want an ID comparison then it's clearer to do that explicitly.

def userBarIds = allBarsOfUser*.id
def intersectedBars = bars.findAll { it.id in userBarIds }


来源:https://stackoverflow.com/questions/11666426/how-to-convert-javassist-instance-into-instance-of-a-specific-domain

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!