Правильно ли работает @Loader для аннотаций (с использованием JPA)? - PullRequest
1 голос
/ 16 июня 2011

Это несколько надуманный пример, призванный показать точку. Вот два класса сущностей, связанных отношением и именованным запросом:

@Entity
@NamedNativeQuery(name = "loadFoo",
              query = "select * from foos where bar_id = ?",
              resultClass = Foo.class)                  
public class Bar {
@Id private int id;

@ManyToOne @Loader(namedQuery = "loadFoo") private Foo foo;

public void setId(int id) { this.id = id; }

public int getId() { return id; }

public void setFoo(Foo foo) { this.foo = foo; }

public Foo getFoo() { return foo; }
}

А потом:

@Entity @Table(name="foos")
public class Foo {
@Id @GeneratedValue private int id;

@Column(name="bar_id") private int barId;

public void setBarId(int barId) { this.barId = barId; }

public int getBarId() { return barId; }

public void setId(int id) { this.id = id; }

public int getId() { return id; }
}

Странно то, что именованный запрос прекрасно работает в модульном тестировании:

Вот настройки:

    Bar bar = new Bar();
    entityManager.persist(bar);
    entityManager.flush();

    Foo foo = new Foo();
    foo.setBarId(bar.getId());

    entityManager.persist(foo);
    entityManager.flush();
    entityManager.clear();

И это правильно возвращает Foo, поэтому, похоже, нет проблемы с именованным запросом:

    Foo foo2 = (Foo) entityManager.createNamedQuery("loadFoo").setParameter(1, bar.getId()).getSingleResult();

Но нагрузка не идет:

    Bar bar2 = entityManager.find(Bar.class, bar.getId());
    Foo foo3 = bar2.getFoo();       
    assertEquals(foo2.getId(), foo3.getId());

Ошибок нет. Возвращаемый объект просто нулевой. Аннотация @Loader фактически обрабатывается модулем постоянства, потому что, если я сделаю именованный запрос недействительным, то будет вызвано исключение при вызове getFoo (). Но оно никогда не возвращает правильное значение.

1 Ответ

1 голос
/ 16 июня 2011

@ Loader может применяться только для класса или коллекции, но не для @ * ToOne.В вашем случае вам нужно поместить аннотацию @Loader поверх класса Foo.

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