2015-08-20 2 views
-1

Je suis en train de construire un service simple de repos dans laquelle je peux ajouter des clients et de les mettre à jour, essentiellement comme une expérience pour apprendre les technologies Java EE. J'utilise cette application dans TomEE et j'utilise Eclipse et Maven pour coder et construire.OpenJPA @OneToMany Liste retour null

Dans mon projet, j'ai la classe principale de l'entité nous appelons « Clients ». Avec un client, vous pouvez avoir plusieurs emplacements et plusieurs contacts, donc j'ai ces deux configurations comme un mappage d'entité unidirectionnel utilisant @OneToMany. Je suis capable de générer le client avec le mappage à l'adresse et les contacts, chacune de ces tables ayant l'ID correspondant au client. Quand je vais ensuite voir les données, toutes les données dans "Client" sont là, mais juste une valeur de NULL pour "Adresses" et "Contacts". J'utilise un EJB en tant que Entity Manager et j'ai une configuration CriteriaQuery pour obtenir les données.

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(); 
    } 
    ... 
} 

Je n'ai pas une annotation @ManyToOne dans les deux ClientAddress ou ClientContacts depuis sa cartographie un sens unique. Les entrées de base de données sont toutes créées, mais il semble que je ne puisse pas récupérer l'adresse et les données de contact comme je l'avais prévu. Je suis nouveau à ce sujet, donc je suppose que je peux interroger les données erronées ou il y a quelque chose de supplémentaire nécessaire sur l'entrée pour qu'il soit en mesure de cartographier correctement sur la demande.

Je suis en cours d'exécution OpenJPA 2.4 et tomee 1.7.2.

Répondre

1

Je pense que vous devez récupérer les données manuellement, car la valeur par défaut de type d'extraction d'une relation de @OnToMany est FetchType.LAZY.

Vous avez deux options pour charger les données dépendantes:

  1. Vous pouvez définir un fetchtype désireux en utilisant l'annotation @OneToMany de cette façon:

    @OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn (name = "vendor_id", referencedColumnName = "id") Liste des adresses privées

  2. Vous pouvez ajouter une clause vous chercher à la requête de critères.

    CriteriaQuery cq = em.getCriteriaBuilder() CreateQuery (Client.class). Racine racine = cq.from (Client.class) root.fetch (Client_.addresses); root.fetch (Client_contacts); return em.createQuery (cq) .getResultList();