EclipseLink 2.5.2 JPA 2.1 ничего не извлекает путем извлечения соединения с внешним ключом ManyToOne
У меня был проект Java EE, разработанный NetBeans 8.0.1 с использованием EclipseLink 2.5.2. JPA 2.1 работает в WebLogic 12c.
Есть две сущности, имеющие отношение многие-к-одному, т.е. одна FirmEntity с несколькими SiteEntity. Сущность отношений как:
@Entity
@Table(name = "site", catalog = "ozssc", schema = "public")
......
@NamedQuery(name = "SiteEntity.findBySiteOwner", query = "SELECT s FROM SiteEntity s left join fetch s.siteOwner where s.siteOwner.firmAbn = :siteOwnerAbn"),
......
public class SiteEntity implements Serializable {
......
@JoinColumn(name = "site_owner", referencedColumnName = "firm_abn", nullable = false)
@**ManyToOne**(optional = false, fetch = FetchType.EAGER)
private FirmEntity siteOwner;
......
get......
set......
......
@Override
public String **toString**() {
return "com.longz.ozssc.model.SiteEntity[ siteId=" + siteId + " ]";
}
}
FirmEntity определяется как:
@Entity
@Table(name = "firm", catalog = "ozssc", schema = "public")
......
public class FirmEntity implements Serializable {
......
@**OneToMany**(cascade = CascadeType.ALL, mappedBy = "siteOwner", fetch = FetchType.LAZY)
private List<SiteEntity> siteEntityList;
......
}
Я определил удаленный интерфейс для удовлетворения моих бизнес-требований:
List<SiteEntity> findSitesByOwner(String siteOwnerAbn);
Реализуйте это в EJB как:
@Override
public List<SiteEntity> findSitesByOwner(String siteOwnerAbn) {
Query query = em.createNamedQuery("SiteEntity.findBySiteOwner");
/*String firmAbn = siteOwner.getFirmAbn();*/
System.out.println("Site Owner for query by Firm ABN string: |"+siteOwnerAbn+'|');
query.setParameter("siteOwnerAbn", siteOwnerAbn);
return new LinkedList<SiteEntity>(query.getResultList());
}
Эта функция принимает строку в качестве параметра и возвращает список SiteEntity. Но, как ни странно, распечатка EJB-контейнера совершенно другая, она распечатывается как:
<Feb 27, 2015 10:37:51 AM EST> <Notice> <Stdout> <BEA-000000> <Site Owner for query by Firm ABN string: |com.longz.ozssc.model.FirmEntity[ firmAbn=61315477824 ]|>
Обратите внимание: содержимое между двумя разделителями '|' Предлагаемый распечатает строку как " 61315477824 ", это то, что я отправил на интерфейс EJB с моего контроллера Spring MVC. Но контейнер EJB выводится как " com.longz.ozssc.model.FirmEntity [firmAbn = 61315477824] ", и эта строка является функцией SiteEntity.toString(), которая выводится на печать.
Таким образом, я никогда не получаю список сайтов должным образом по этому запросу. Это ошибка EclipseLink или Netbeans? Почему я даю ему строку, но они принимают его как объект сущности? Или что-то не так в моих методах?
Любой совет приветствуется, с большим признательностью.
Редактировать:
Вот как я вызвал EJB с моего контроллера MVC:
@RequestMapping("/indexSiteEntityBySiteOwner")
public ModelAndView listSiteEntitysBySiteOwner(@RequestParam FirmEntity siteOwner) {
ModelAndView mav = new ModelAndView();
List<SiteEntity> siteentitys = siteEntityFacadeRemote.findSitesByOwner(siteOwner.getFirmAbn());
System.out.println("fetched site entity list by site owner: |"+siteentitys.size()+'|');
mav.addObject("siteentitys", siteentitys);
mav.setViewName("siteentity/listSiteEntitys.jsp");
return mav;
}
Метод контроллера принимает FirmEntity в качестве параметра, возвращает MAV. Функция findSitesByOwner была определена в интерфейсе EJB, принимает в качестве параметра String и возвращает список SiteEntity.
Обратите внимание, что я использовал siteOwner.getFirmAbn(), чтобы получить ABN фирмы, он вернет тип ABN строки.