Всегда ли Hibernate загружает связанный объект, даже если он может быть нулевым?

У меня вопрос по Hibernate.

У меня есть два объекта с отношением «многие к одному»:

Например: Объект 1:

 public class Person {

 @Basic
 @Column(length = 50)
 protected String name;

 @NotFound(action=NotFoundAction.IGNORE)
 @ManyToOne(fetch = FetchType.EAGER)
 @JoinColumn(name = "groupCode", referencedColumnName = "code", updatable=false)
 protected Group group;

 ...all the getters and setters...
 }

Объект 2:

 public class Group {
  @Id
  @Basic
  @Column(length = 3, nullable = false)
  protected String code;

  @Basic
  @Column(length = 30, nullable = false)
  protected String groupName;

   @Basic
   @Column(precision = 15, scale = 0)
   protected long exampleFieldId;

   ...rest of code....
  }

Я постарался сделать этот пример максимально простым. Моя проблема в том, что связанный объект (группа) в Person может быть нулевым. В настоящее время Hibernate загружает экземпляр Group, когда я загружаю определенного человека, и выдает исключение, потому что он не может установить для exampleFieldId значение null (поскольку это примитивный тип).

Я могу остановить эту ошибку, изменив long на Long, однако я бы подумал, что объект Group на Person должен быть нулевым, и, следовательно, объект Group не загружается в первую очередь?

Кто-нибудь знает, загружает ли Hibernate связанный объект независимо от того, разрешено ли ему быть нулевым, или я пропустил какую-то важную аннотацию?

Спасибо


person rioubenson    schedule 24.12.2012    source источник


Ответы (2)


Как упоминает Фиро:

Вы отключили ленивую загрузку и установили fetchmnode для присоединения, потому что NHibernate должен получить их, чтобы решить, должен ли он аннулировать его или нет, и он не может решить, что только с идентификатором

Похоже, это та же проблема, с которой вы сталкиваетесь, даже если она находится в NHibernate. Хотя стоит проверить!

Почему Hibernate пытается загрузить ассоциации not-found=ignore ?

Изменить. Возможно, вы пропустили @Fetch(FetchMode.JOIN).

person Tony Day    schedule 24.12.2012

Наконец-то я понял, что здесь происходит, и проблема была не в Hibernate.

Глубоко в коде у меня был UserType, который преобразовывал нулевую строку в пустую строку, а это означало, что groupCode на самом деле никогда не будет нулевым. Следовательно, Hibernate предполагает, что есть дочерний объект для загрузки.

Добавление аннотации @Type(type="org.hibernate.type.StringType") над groupCode позволило избежать этой проблемы.

Интересно, что я неправильно понял использование @NotFound(action=NotFoundAction.IGNORE).

Я думал, что он используется для решения описанной выше проблемы, но на самом деле он определяет, что делать, если установлен groupCode, но нет соответствующей группы; не что делать, когда groupCode имеет значение null.

Другие могут попасться на это тоже.

person rioubenson    schedule 27.12.2012