Pregunta

Tengo una duda, es cuando creamos uno a muchos como bidireccional. Pondremos una referencia de clase para padres en la clase infantil.

ver el código.

Persona.java

@Entity
@Table(name="PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="personId")
     private int id;
    @Column(name="personName")
    private String name;
    @OneToMany(cascade =CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name="personId") 
    private Set <Address> addresses;
         ....
         ....
}

Dirección.java

@Entity
@Table(name = "ADDRESS")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "addressId")
    private int id;
    @Column(name = "address",nullable=false)
    private String address;
    @ManyToOne(cascade =CascadeType.ALL)
    @JoinColumn(name="personId",nullable=false)
    private Person person;
           ....
           ....
    }

aquí Persona.java es la clase de padres y Dirección.java es la clase infantil. Cuando obtenemos el objeto principal de la base de datos, está cargando la clase infantil. está bien. Sin proble.

Pero en viceversa, es decir. Si estamos obteniendo clase infantil, también está sosteniendo la clase de los padres (persona).

EG: Botamos la dirección por ID de dirección. Simplemente asuma la dirección recuperada 100 de la base de datos.

Pero en la clase de direcciones persona Variable Hold Hold el objeto de los padres (persona) ASLO.

Mi duda esta aquí

es uso Diferentes 100 memoria de persona. con los mismos datos. en Clase de dirección. ?

Mi dao es así.

public List<Address> getAllAddressByPersonId(int personId) {
        List<Address> addressList =  null;
        try {
            DetachedCriteria criteria = DetachedCriteria.forClass(Address.class);
            criteria.createCriteria("person").add(Restrictions.eq("id", personId));
            addressList = getHibernateTemplate().findByCriteria(criteria);
        } catch (HibernateException e) {
            e.printStackTrace();
        } catch (DataAccessException e) {
            e.printStackTrace();
        }

        return addressList;

Simplemente suponga que el tamaño de AddrsSlist es 100.

me gusta

per =  addressList.get(0).getPerson() , 

per 1 = addressList.get(1).getPerson(),

per2 = addressList.get(2).getPerson(),

....

per99 =  addressList.get(99).getPerson(). 

aquí PER1, PER2 .... y por 99 están utilizando la misma memoria o diferente.

Si es lo mismo, está bien. De lo contrario, puede causar cualquier problema de rendimiento de más utilización de memoria.

Ayuda por favor ...

¿Fue útil?

Solución

Hibernate hace verificación de identidad. Una sesión de hibernación contiene solo una sola instancia de un objeto con la misma ID. Entonces, si PER, PER1, ... PER99 es una persona, tendrá un objeto para ello. De lo contrario, diferentes objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top