unidirectional onetomany one many ejemplo column java jpa entity one-to-many

java - onetomany - relation one to many hibernate



La relaciĆ³n OneToMany no funciona (4)

Esto no es un mensaje de error. La instrucción de impresión hace que se invoque toString () en el IndirectSet subyacente.

TopLink colocará un IndirectSet en la variable de instancia cuando el objeto del dominio que contiene se lea desde la base de datos. Con el primer mensaje enviado al IndirectSet, los contenidos se recuperan de la base de datos y se reanuda el comportamiento normal del Conjunto.

IndirectCollection tipos de IndirectCollection se implementan específicamente para no crear instancias en toString () :

Para propósitos de depuración, #toString () no activará una lectura de base de datos.

Sin embargo, cualquier otra llamada en la colección indirecta, por ejemplo, size () o isEmpty () creará una instancia del objeto.

La lectura de la base de datos se activa finalmente cuando uno de los métodos "delegados" realiza la primera llamada a getDelegate (), que a su vez llama a buildDelegate (), que envía el mensaje getValue () al poseedor de valor. El titular del valor realiza la lectura de la base de datos. Con el primer mensaje enviado al IndirectSet, los contenidos se recuperan de la base de datos y se reanuda el comportamiento normal del Conjunto.

Véase también IndirectList: no instanciado

Mis Tablas:

Producto : id, nombre

Oferta : id, valor, product_id

Entidades:

@Entity @Table(name="product") public class Product implements Serializable { @OneToMany(mappedBy="product") private Set<Offer> offers; ... } @Entity @Table(name="offer") public class Offer implements Serializable { @ManyToOne @JoinColumn(name="PRODUCT_ID") private Product product; ... }

Cuando trato de obtener algunos datos de la tabla Product , obtengo una java.lang.NullPointerException , y este código: product.getOffers() devuelve:

{IndirectSet: no instanciado}

¿Cómo arreglar esto?


Esto es lo que hice

// force load of the set. entity.getSecrets().isEmpty(); System.out.println(entity.getSecrets());


Esto resolvió mi problema

@OneToMany (mappedBy = "columnName", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)


Si obtiene {IndirectSet: not instantiated} al acceder a product.getOffers() lo más probable es que esté ejecutando este código fuera de la transacción.

De forma predeterminada, las relaciones @OneToMany y @ManyToMany se cargan de forma perezosa, lo que significa que, para un mejor rendimiento, solo se obtendrán datos cuando quiera acceder a ellos por primera vez. Esto debe suceder dentro de una transacción activa.
Si no accede a estos datos dentro de este alcance, entonces no podrá volver a acceder a estos datos. Debe poner su código de invocación dentro de la transacción activa o cambiar la colección para que esté eager lugar de perezoso:

@OneToMany(mappedBy="product", fetch=FetchType.EAGER)