2015-08-20 5 views
-1

Я пытаюсь создать простую службу Rest, в которой я могу добавлять Клиентов и обновлять их, в основном как опыт изучения технологий Java EE. Я запускаю это приложение в TomEE и использую Eclipse и Maven для кодирования и сборки.OpenJPA @OneToMany Список, возвращающий null

В моем проекте у меня есть основной класс Entity, который мы будем называть «Клиенты». С клиентом у вас может быть несколько местоположений и несколько контактов, поэтому у меня есть обе эти настройки как однонаправленное отображение сущностей, используя @OneToMany. Я могу сгенерировать Клиента с отображением адреса и контактов, причем каждая из этих таблиц имеет идентификатор, соответствующий обратному клиенту. Когда я перехожу к просмотру данных, все данные в «Клиенте» есть, но только значение NULL для «Адреса» и «Контакты». Я использую EJB в качестве Менеджера сущностей и имею настройку CriteriaQuery для получения данных.

Client.java

@Entity 
public class Client { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="vendor_id", referencedColumnName="id") 
    private List<ClientAddress> addresses 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="vendor_id", referencedColumnName="id") 
    private List<ClientContact> contacts 

    ... 

ClientAddress.java

@Entity 
public class ClientAddress { 
    ... 
} 

ClientContacts.java

@Entity 
public class ClientContacts { 
    ... 
} 

ClientEntityBroker.java

@Stateless 
@Localbean 
public class VendorEntityBroker { 

    @PersistenceContext(unitName = "client-mysql", 
         type=PersistenceContextType.TRANSACTION) 
    private EntityManager em; 

    public List<Vendor> getAllClients() { 
     CriteriaQuery<Client> cq = em.getCriteriaBuilder().createQuery(Client.class); 
     cq.select(cq.from(Client.class)); 

     return em.createQuery(cq).getResultList(); 
    } 
    ... 
} 

У меня нет аннотации @ManyToOne в ClientAddress или ClientContacts с момента его однонаправленного сопоставления. Записи базы данных все создаются, но я, похоже, не могу найти адрес и контактные данные, как я ожидал. Я новичок в этом, поэтому я предполагаю, что я могу запросить данные неправильно или есть что-то лишнее на вкладке, чтобы он мог правильно отобразить запрос.

Я запускаю OpenJPA 2.4 и TomEE 1.7.2.

ответ

1

Я думаю, что вам нужно получить данные вручную, потому что по умолчанию для типа @OnToMany используется тип FetchType.LAZY.

У вас есть два варианта, чтобы загрузить зависимые данные:

  1. Вы можете определить, нетерпеливый fetchtype с помощью аннотаций @OneToMany таким образом:

    @OneToMany (каскадный = CascadeType.ALL, выборки = FetchType.EAGER) @JoinColumn (имя = "VENDOR_ID", referencedColumnName = "идентификатор") частный список адресов

  2. Вы можете добавить выборки положение, чтобы вы критерии запроса.

    КритерииQuery cq = em.getCriteriaBuilder(). CreateQuery (Client.class); Корневой корень = cq.from (Client.class) root.fetch (Client_.addresses); root.fetch (Client_.contacts); return em.createQuery (cq) .getResultList();

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