2015-06-17 4 views
2

У меня есть проблема с тем, как спящий режим загружает некоторые компоненты из базы данных.Hibernate, вызывающий неправильный сеттер

Мы используем bean/beanHistoric структуру, чтобы сохранить все изменения, сделанные на этом компоненте. Когда мы сохраняем некоторые изменения в экземпляре bean, мы создаем beanHistoric с теми же данными и сохраняем его, чтобы сделать это, чтобы некоторые сеттеры не были точно настроены. Например:

@Entity 
public class beanHistoric { 
    List<AnotherBeanHistoric> anotherBeanListH; 

    @OneToMany(mappedBy="beanHistoric", cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @Cascade({org.hibernate.annotations.CascadeType.ALL}) 
    public List<AnotherBeanHistoic> getAnotherBeanList(){ 
     return this.anotherBeanListH; 
    } 
    public void setAnotherBeanList(List<AnotherBean> anotherBeanList){ 
     for (AnotherBean anotherBean : anotherBeanList){ 
      anotherBeanListH.add(new AnotherBeanHistoric(anotherBean)) 
     } 
    } 

    private void setAnotherBeanListH(List<AnotherBeanHistoric> anotherBeanList){ 
     this.anotherBeanListH = anotherBeanList; 
    } 
} 

Как вы можете увидеть атрибут записывается anotherBeanListH, но зимуют звонит setAnotherBeanList для заполнения объекта один раз его загружены из базы данных вместо setAnotherBeanListH.

Любые идеи, почему это происходит?

+0

«setAnotherBeanListH» является приватным - попробуйте сделать его общедоступным – vikingsteve

+0

Как отображается объект. Где аннотации? –

+0

Попытка это прямо сейчас, и это не сработало. Я сделал это частным, так как спящий режим должен использовать рефлексию для заполнения атрибутов и доступа к приватным методам. (Также я не хочу, чтобы какой-нибудь любопытный разработчик использовал его ;-)) Редактирование вопроса с помощью анотаций. – Koalk

ответ

1

Хорошо, так как я редактировал вопрос, добавляя анотации, используемые в bean-компоненте, я понял, что у моего получателя было имя getAnotherBeanList вместо getAnotherBeanListH.

Поскольку я использовал свои анотации в getter (какой-то унаследованный стиль, которым я должен был следовать) вместо самого атрибута, кажется, что hibernate понимает, что имя получателя было именем атрибута, поэтому вызывающий getAnotherBeanList.

Должно было выглядеть немного сложнее, прежде чем задавать этот вопрос, но я думаю, стоит знать, что это может произойти.

2

Вы сказали Hibernate, что свойство, названное anotherBeanList, было отображено как OneToMany, аннотируя геттер getAnotherBeanList(). Таким образом, при чтении объекта из базы данных он заполняет ассоциацию, вызывая связанный с ней сеттер: setAnotherBeanList(). Наоборот, было бы совершенно неожиданно. Почему Hibernate вызовет setBar(), если свойство имеет имя foo?

Смежные вопросы