style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Asociar un varlor de una entidad dentro de otra entidad de JPA

Estoy trabajando con una base de datos y JPA, me he encontrado con el problema de mapear datos de varias tablas en una sola entidad, estuve leyendo que eso lo podía realizar con las anotaciones @SecondaryTables y @SecondaryTable, y ya logre agregar varios datos de otras entidades en la entidad principal (Usuario), pero en un campo en específico no se como hacerle porque ese campo es la referencia hacia otra entidad que se genero por una relación que hay de uno a muchos, coloco el código para que me entiendan mejor:

El caso es como podría agregar el valor del campo "dato" de RelacioDatoPK en la entidad Usuario, ya sea usando SecondaryTables o no.

De antemano gracias por sus respuestas.

Usuario

@Entity
@Table(name = "Usuario")
@SecondaryTable(name = "Empresa", pkJoinColumns = @PrimaryKeyJoinColumn(name = "IdEmpresa", referencedColumnName = "IdEmpresa"))
@XmlRootElement
public class Usuario implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "IdUsuario")
        private Integer idUsuario;
        @Column(name = "idPerfil", table = "Empresa")
        private String idPerfilEmpresa;
        @Column(name = "telefono", table = "Empresa")
        private String telefono;
        @Basic(optional = false)
        @Column(name = "NombreUsuario")
        private String nombreUsuario;
        @Column(name = "Nombre")
        private String nombre;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "Usuario")
        private List <RelacionDato> relacionDatoList;
       

        // ... despues sus getters y setters respectivos

}

Empresa

@Entity
@Table(name = "Empresa")
@XmlRootElement
public class Empresa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "IdEmpresa")
    private Integer idEmpresa;
    @Column(name= "telefono")
    private Integer telefono;

    // ... mas atributos y los getters y setters respectivos.
}

RelacionDato

@Entity
@Table(name = "Rel_Dato")
@XmlRootElement
public class RelacionDato implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected RelacionDatoPK relacionDatoPK;

//... mas atributos y los getters y setters respectivos.

}

RelacionDatoPK

@Embeddable
public class RelacionDatoPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "idUsuario")
    private int idUsuario;
    @Basic(optional = false)
    @Column(name = "dato")
    private String dato;

//... mas atributos y los getters y setters respectivos.

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

password as PK?

Asumiendo que las clases fueron generadas a partir del esquema de la base de datos ... entonces un usuario puede tener varias contraseñas asociadas ... es decir, que la tabla REL_PASSWORD incluye a la contraseña (password) como parte de la clave primera, ¿correcto?

Imagen de Cid

Asi es

Bueno en realidad no son los nombres reales coloque nombres solo por colocarlos tengo que asociar una serie de tokens o cadenas con un usuario pero por aquello de que no quieren ver el codigo de la empresa en internet coloque otros nombres, las entidades fueron creadas con el IDE Netbeans (Generate Entities from DataBase).

Imagen de ezamudio

jajajajaj

El password como llave primaria... me recordó una historia de horror (completamente real) que publiqué aquí hace tiempo

http://www.javamexico.org/foros/java_mexico/historias_de_horror_en_progr...

Imagen de Cid

jejeje me equivoque pues

Puse datos por ponerlos pero creo que debi poner "dato" en lugar de poner "password", la intención era no colocar el código de la empresa por aquello de la confidencialidad.

Debido a esto ya cambie el código, jajaja no más bullying por favor.

Imagen de Cid

Ya lo solucione

Pues no me quedo otra más que usar la anotación @Transient para el atributo dato y obtener la referencia en su metodo get, y si me sirve porque es una base con permisos de sólo lectura.

...
@Transient
private String dato;

public String getDato(){
    List<RelacionDato> list =   this.getIdEmpresa().getRelacionDatoList();
    return list.isEmpty()?null:list.get(0).getRelacionDatoPK().getDato();
}

...

uno-a-uno

 

Al principio tú habías dicho:

tengo que asociar una serie de tokens o cadenas con un usuario

Sin embargo, después en código:

list.isEmpty() ? null : list.get(0).getRelacionDatoPK().getDato();

Entonces, ¿se trata de una relación uno-a-uno, en lugar de uno-a-muchos? :-S

~~~

Imagen de Cid

Esta mapeado uno a muchos pero yo solo tomo 1

Pues a mi solo me pasaron la base pero segun tengo entendido solo pueden tener un dato asociado, no se porque se mapeo asi.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">