Hibernate / JPA equals () и hashCode () с отложенным бизнес-идентификатором - PullRequest
6 голосов
/ 09 июня 2011

Мне интересно, как написать корректные equals () и hashCode () для объектов Hibernate, имеющих отношение Lazy Loaded ManyToOne к другому объекту, который важен в качестве бизнес-ключа. Обратите внимание, что я уже прочитал документацию Hibernate по этой теме и знаю, что должен / не должен использовать идентификатор объекта.

Чтобы уточнить, вот пример:

public class BusinessEntity implements Serializable
{
    //for simplicity, here just the important part
    private String s;

    @ManyToOne(fetch= FetchType.LAZY )
    private ImportantEntity anotherEntity;

    @Override
    public boolean equals( Object obj )
    {
       //Here I would like to call something like
       // (obj.getAnotherEntity.getName.equals(getAnotherEntity.getName) && obj.getS().equals(getS());

       return true;
    }
}

Конечно, это просто упрощенный пример. Но я надеюсь, что смогу объяснить свой сценарий. Кто-то пробовал что-то подобное раньше? Я не нашел ничего относительно этой темы.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Для простоты я пропустил нулевой код безопасности. Но идея состоит в том, чтобы создать дополнительное свойство, которое сохранит имя сущности и не будет выставлять его внешнему миру

public class BusinessEntity implements Serializable
{
    //for simplicity, here just the important part
    private String s;

    @ManyToOne(fetch= FetchType.LAZY )
    private ImportantEntity anotherEntity;

    private String anotherEntityName;

    @Override
    public boolean equals( Object obj )
    {
        if(BusinessEntity.class.isAssignableFrom(obj.getClasS())){  
         BusinessEntity other =  (BusinessEntity)obj;
         return other.anotherEntityName.
                equals(this.anotherEntityName) && 
                other.s.equals(this.s);

        }
       return true;
    }
    public void setAnotherEntity(ImportantEntity ie){
        anotherEntityName= ie.getName();
        anotherEntity = ie;
    }
}
2 голосов
/ 09 июня 2011

В равных вы должны использовать instanceof для сравнения типов и методов получения свойств, которые вам нужно включить.

instanceof используется из-за прокси-классов, которые использует Hibernate, и методов получения, которые используются для включения lazyгрузы.

...