entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

jpa no me esta tomando en cuenta las etiquetas

por alguna razón jpa dejo de seguir las etiquetas. Le coloca otros nombres a las tablas y le cambia la longitud de los campos, a pesar de que tiene @Column(name="nombre").Si cambio el nombre del campo por otro cualquiera, igualmente sigue tomando el nombre que él quiere, que siempre es el mismo.Uso postgreSQL.

He reinstalado el JDK y el IDE. Después actualice el JDK. También intente creando un proyecto nuevo. Probe el código en otro computador y nada de eso funcionó.

El código de las clases que se que estan dando problemas, y como esta quedando en la base de datos.

package clases;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

@MappedSuperclass
public abstract class Ticket implements Serializable 
{

    private static final long serialVersionUID=1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    //atributo con problemas de nombre. El nombre de la tabla esta en la subclase
    @ManyToOne
    @JoinColumn(referencedColumnName = "id_empleado_caja")
    private EmpleadoCaja cajero;

    @Column(length = 25)
    private String serie;

    private Integer numeroDeDocumento;

    private Integer numeroDeControl;

    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaDeDocumento;

    @Temporal(TemporalType.DATE)
    private Calendar fechaDeSistema;

    @Column(length = 50)
    private String serialImpresora;

    @Column(length = 50)
    private String numeroDeReporteZ;
//resto de la clase
}
package clases;

import java.io.Serializable;
import java.util.LinkedList;
import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "facturas_encabezado")
@AttributeOverrides({@AttributeOverride(name="id",                column=@Column(name = "id_factura_encabezado")),
                     //el atributo con problemas                   //nombre que debe tener e campo en la tabla
                     @AttributeOverride(name="cajero",            column=@Column(name = "id_empleado_caja_factura_encabezado")),
                     @AttributeOverride(name="serie",             column=@Column(name = "serie_factura_encabezado")),
                     @AttributeOverride(name="numeroDeDocumento", column=@Column(name = "numero_documento_factura_encabezado")),
                     @AttributeOverride(name="numeroDeControl",   column=@Column(name = "numero_de_control_factura_encabezado")),
                     @AttributeOverride(name="fechaDeDocumento",  column=@Column(name = "fecha_factura_encabezado")),
                     @AttributeOverride(name="fechaDeSistema",    column=@Column(name = "fecha_del_sistema_factura_encabezado")),
                     @AttributeOverride(name="serialImpresora",   column=@Column(name = "serial_impresora_factura_encabezado")),
                     @AttributeOverride(name="numeroDeReporteZ",  column=@Column(name = "numero_reporte_z_factura_encabezado"))

})

public class Factura extends Ticket implements Serializable 
{
   //resto de código
}

Así es como están quedando los campos en la base de datos

facturas_encabezado
( 
  id_factura_encabezado serial NOT NULL,
  fecha_factura_encabezado timestamp without time zone,
  fecha_del_sistema_factura_encabezado date,
  numero_de_control_factura_encabezado integer,
  numero_documento_factura_encabezado integer,
  --cambio de longitudes de campo
  numero_reporte_z_factura_encabezado character varying(255),
  serial_impresora_factura_encabezado character varying(255),
  serie_factura_encabezado character varying(255),
  --cambia el nombre del campo
  cajero_id_empleado_caja integer,--resto de código
)

1 Respuesta

1voto

Javi2EE Puntos6630

Buenas, en cuanto a las longitudes de los campos, seguramente tendrás que volver a definirlas dentro de la anotación @AttributeOverride:

@AttributeOverride(name="serialImpresora",   column=@Column(name = "serial_impresora_factura_encabezado", length=50)),

añadiendo el campo length ya que hasta donde yo se, si defines @Column en la Entity, no hereda el @Column de la @MappedSuperclass.

Respecto a la columna que se llama cajero_id_empleado_caja, ese nombre lo asigna automáticamente JPA como una concatenación del nombre del atributo "cajero" y el nombre de la columna definida en referencedColumnName = "id_empleado_caja", si lo que buscas es utilizar un nombre propio tendrás que definir el atributo name dentro de @JoinColumn y no de @Column asi:

@JoinColumn(name="nombre q quieres", referencedColumnName = "id_empleado_caja")

Realmente el referencedColumnName por defecto apunta a la columna marcada en la entity EmpleadoCaja con el atributo @Id y solo hay que reescribirlo en los casos puntuales en los que se quiere que referencie a alguna otra clave.
@JoinColumn tiene una función y cumple un propósito distinto a @Column, si de verdad es totalmente necesario re definir el nombre de esa columna probaria a añadir el atributo @JoinColumn dentro de la anotación @AttributeOverride aunque no se si esto se permite en JPA, si no se permite entonces optaría por definir de nuevo la relación dentro de la Entity.

public class Factura extends Ticket implements Serializable 
{
    @ManyToOne
    @JoinColumn(name="id_empleado_caja_factura_encabezado",referencedColumnName = "id_empleado_caja")
    private EmpleadoCaja cajero;
}

Espero haberte ayudado.
Saludos

1voto

kevinesaa comentado

Muchas gracias por la ayuda, funcionó. Y para el caso de @JoinColumn, descubrí que para sobre escribir se usa@AssociationOverride.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta