De mi investigación, no parece probable que su posible, pero aquí es mi caso de uso.

Tengo una tabla llamada usuario con un id de dirección.

Me gustaría mapa de un UserReference y clase de Usuario a esta mesa donde UserReference no contiene el objeto de Dirección (para guardar sql unirse tiempo) y que el Usuario hace contener el objeto de Dirección (en caso de que sea necesario).

Que no puedo usar, ya que se espera que una de unirse a la mesa, y yo simplemente no puede definir dos clases separadas debido a un get() parece que vuelve el doble de cada fila (uno por Usuario, uno para UserReference).

¿Alguien sabe cómo se podría ir sobre esto?


Supongo que debería tratar de explicarme mejor.

public class UserReference {
    private int id;
    private String name;
}

public class User extends UserReference {
    private Address;
}

Me gustaría mapa UserReference y Usuario, de modo que puede consultar para UserReference cuando solo necesito los detalles básicos, y el Usuario cada vez que necesito el objeto completo.

Entiendo que se me puede simplemente hacer que sea perezoso cargado, pero tengo un sistema de dos niveles que unproxies todos los objetos una vez que se pasa a través de las capas.


edición:

Tal vez mi pregunta era demasiado ambiguo, pero basado en las respuestas no parece muy posible hacer lo que quiero. Gracias de todos modos todo el mundo.

  • En realidad, es absolutamente bien para tener la misma mesa asignada a varias entidades. Sin embargo, si usted se está resolviendo su «unproxy» problema (apuesto a que te refieres a la navegación de todo el objeto gráfico?) por tal enfoque, usted va a estar en serios problemas en el futuro, especialmente los que tienen más complicadas relaciones de objeto, y en función diferente que necesita de una combinación diferente de las relaciones.
  • Hmm podría usted explicar por qué esto puede ser un problema de la línea?
  • por ejemplo, Si el sistema a seguir creciendo, usted puede tener una entidad en Una relación de a a B, C, D y E. Y usted puede tener diferentes funciones que la función 1 se necesita sólo Una, la función 2 tendrá Un + B, función 3 tendrá Un + C + D, la función 4 tendrá a + C + E, etc. Mediante su enfoque, usted necesitará tener diferentes formas de Una entidad para hacer frente con el uso de distintas funciones. Que va a ser una pesadilla de mantenimiento
InformationsquelleAutor kennyg | 2015-04-15

3 Comentarios

  1. 4

    UserReference.java

    @Entity
    @DiscriminatorColumn(name = "type")
    @DiscriminatorValue(value = "UserReference")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    public class UserReference extends BaseEntity {
    
        private String name;
    }

    User.java

    @Entity
    @DiscriminatorValue(value = "User")
    public class User extends UserReference {
        @OneToOne
        @JoinColumn(name = "address_id")
        private Address address;
    
    }
    • ¿el cartel original realmente quiere la herencia ?
  2. 2

    Tu pregunta no es muy clara para mí, pero voy a tratar de responder según mi comprensión. Depende de lo que usted realmente quiere persistir y lo que queremos como java entidad.

    Considerar que quiere representar a la clase de Usuario con una tabla de base de datos es decir, representan el Usuario como entidad JPA. Ahora usted puede Crear una clase Incrustada, que será parte de otra clase.

    Así que usted puede asignar una clase de Dirección en la Entidad de Usuario y hacer la clase de Dirección como ofrece la posibilidad de integrar el uso de @Embeddable anotación
    paquete com.thejavageek.embeddabledemo;

    import javax.persistence.Embeddable;
    
    @Embeddable
    public class Address {
    
        private String area;
        private String city;
        private String pincode;
    
        public String getArea() {
            return area;
        }
    
        public void setArea(String area) {
            this.area = area;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getPincode() {
            return pincode;
        }
    
        public void setPincode(String pincode) {
            this.pincode = pincode;
        }
    
    }

    y puede incluir esta clase incrustada a continuación

    package com.thejavageek.embeddabledemo;
    
    import javax.persistence.Embedded;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.TableGenerator;
    
    @Entity
    public class Person {
    
        @TableGenerator(name = "person_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 100)
        @Id
        @GeneratedValue(strategy = GenerationType.TABLE, generator = "person_gen")
        private String idperson;
        private String name;
    
        @Embedded
        private Address address;
    
        public String getIdperson() {
            return idperson;
        }
    
        public void setIdperson(String idperson) {
            this.idperson = idperson;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Address getAddress() {
            return address;
        }
    
        public void setAddress(Address address) {
            this.address = address;
        }
    
    }
  3. 0

    Creo que lo que quieres decir es que tienes una tabla como

    USER
    - USER_ID
    - USER_NAME
    - ADDRESS_ID

    y

    ADDRESS
    - ADDRESS_ID
    - ADDRESS_DETAIL

    algo como eso?

    Y quieres tener 2 User entidades, uno de los que contiene la referencia a la Dirección y el otro no (por lo que guardar SQL join tiempo, como usted ha dicho), es mi entendimiento correcto?

    Si es así, usted no necesita hacerlo.

    Simplemente tener una User entidad y poner su Address relación a la PEREZA de exagerado.

    Si en cualquier función que usted necesita Address en su User, hacer un join fetch.

    por ejemplo,

    @Entity
    public class User {
        @Id
        private Long id;
    
        private String name;
    
        @ManyToOne(fetch=FetchType.LAZY)
        private Address address;
    }

    en tal caso, todos normales de recuperación de User no incurrirá en ninguna unirse a Address tabla. Sin embargo, es flexible para hacer algo como

    from User u left join fetch u.address where u.name like 'blabala'
    • Perezoso fetch iba a funcionar, excepto que tengo un sistema multinivel por lo que uno pasa las capas de la Dirección del objeto que se espera que se obtienen.
    • Que no va a ser un problema. He estado haciendo lo mismo durante años. usted tiene dos opciones: 1. Asegúrese de que para las funciones que necesitan dirección, se han recuperado de la dirección (por join fetch etc) antes de devolver el objeto fuera de los límites de las transacciones. O, 2. La construcción de un no-persistentes relacionados con el objeto de valor antes de que regrese de la txn límite. Hay otras maneras, como una sesión abierta en la vista o el uso de jpa impl que permiten perezoso fetch sin la participación activa de txn. Yo no como esas en forma personal.

Dejar respuesta

Please enter your comment!
Please enter your name here