Hibernate nicht bauen Abfrage richtig

stimmen
0

Ich habe ein Problem, wenn ich eine Frage zu meiner Repo mit Seite Seite = entityRepository.findAll (pageable). Also, ich weiß nicht, warum, wenn Hibernate die Abfrage baut diese es tut wie asignatura_id und profesor_id in der Entität asignaturaProfesor wenn seine ID ein Objekt aus AsignaturaProfesorId Entität ist und diese Felder sind id_profesor und id_asignatura

Ich bekomme diese Fehlermeldung:

Hibernate: Wählen Sie profesor0_.id als id1_8_, profesor0_.categoria als categori2_8_, profesor0_.cod_profesor als cod_prof3_8_, profesor0_.email als email4_8_, profesor0_.login als login5_8_, profesor0_.nombre als nombre6_8_, profesor0_.num_creditos_impartir als num_cred7_8_, profesor0_.primer_apellido als primer_a8_8_ , profesor0_.prioridad als priorida9_8_, profesor0_.segundo_apellido als segundo10_8_, profesor0_.usu_alta als usu_alt11_8_ von profesor profesor0_

Hibernate>: Wählen Sie asignatura0_.profesor_id als profesor4_1_0_, asignatura0_.fecha_seleccion als fecha_se1_1_0_, asignatura0_.asignatura_id als asignatu3_1_0_, asignatura0_.fecha_seleccion als fecha_se1_1_1_, asignatura0_.asignatura_id als asignatu3_1_1_, asignatura0_.profesor_id als profesor4_1_1_, asignatura0_.num_creditos als num_cred2_1_1_ von asignatura_profesor asignatura0_ wo asignatura0_ .profesor_id =?

WARN 19148 --- [XNIO-2 Task-8] ohengine.jdbc.spi.SqlExceptionHelper: SQL-Fehler: 1054, SQLState: 42S22 ERROR 19148 --- [XNIO-2 Task-8] ohengine.jdbc.spi.SqlExceptionHelper: unbekannte Spalte 'asignatura0_.profesor_id' in 'field list'

Das ist mein Datenbank-Schema:

CREATE TABLE asignatura_profesor (
id_profesor bigint(20) NOT NULL,
id_asignatura bigint(20) NOT NULL,
fecha_seleccion timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE  CURRENT_TIMESTAMP,
num_creditos bigint(20) NOT NULL,
PRIMARY KEY (id_asignatura,id_profesor,fecha_seleccion),
KEY FK_PROFESORES_ASIGNATURA_PROFESORES_01 (id_profesor),
CONSTRAINT FK_PROFESORES_ASIGNATURA_ASIGNATURAS_02 FOREIGN KEY (id_asignatura) REFERENCES asignatura (id),
CONSTRAINT FK_PROFESORES_ASIGNATURA_PROFESORES_01 FOREIGN KEY (id_profesor) REFERENCES profesor (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


CREATE TABLE profesor (
id bigint(20) NOT NULL AUTO_INCREMENT,
nombre varchar(255) NOT NULL,
primer_apellido varchar(255) NOT NULL,
segundo_apellido varchar(255) NOT NULL,
cod_profesor int(11) NOT NULL,
email varchar(255) NOT NULL,
categoria` varchar(255) NOT NULL,
num_creditos_impartir int(11) DEFAULT NULL,
prioridad int(11) NOT NULL,
usu_alta varchar(255) NOT NULL,
login varchar(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

CREATE TABLE asignatura (
id bigint(20) NOT NULL AUTO_INCREMENT,
nombre varchar(255) NOT NULL,
plan varchar(255) NOT NULL,
titulacion varchar(255) NOT NULL,
creditos int(11) NOT NULL,
num_grupos int(11) DEFAULT NULL,
creditos_teoricos int(11) NOT NULL,
creditos_practicas int(11) NOT NULL,
num_grupos_teoricos int(11) DEFAULT NULL,
num_grupos_practicas int(11) DEFAULT NULL,
usu_alta varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

Dies ist mein Code:

Profesor.java

@Entity
@Table(name = profesor)
public class Profesor implements Serializable ,  Comparable<Profesor>{

private static final long serialVersionUID = 1L;

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

@NotNull
@Column(name = nombre, nullable = false)
private String nombre;

@NotNull
@Column(name = primer_apellido, nullable = false)
private String primerApellido;

@NotNull
@Column(name = segundo_apellido, nullable = false)
private String segundoApellido;

@NotNull
@Max(value = 3)
@Column(name = cod_profesor, nullable = false)
private Integer codProfesor;

@NotNull
@Column(name = email, nullable = false)
private String email;

@NotNull
@Column(name = categoria, nullable = false)
private String categoria;

@Column(name = num_creditos_impartir)
private Integer numCreditosImpartir;

@NotNull
@Max(value = 2)
@Column(name = prioridad, nullable = false)
private Integer prioridad;

@NotNull
@Column(name = usu_alta, nullable = false)
private String usuAlta;

@OneToMany(
    mappedBy = profesor,
    cascade = CascadeType.ALL,
    fetch=FetchType.EAGER,
    orphanRemoval = true
)
private List<AsignaturaProfesor> asignaturas = new ArrayList<>();

@NotNull
@Column(name = login, nullable = false)
private String login;

public Profesor() {}

public List<AsignaturaProfesor> getAsignaturas() {
    return asignaturas;
}

public void setAsignaturas(List<AsignaturaProfesor> asignaturas) {
    this.asignaturas = asignaturas;
}

//GETTER AND SETTERS

public void addAsignatura(Asignatura asignatura, long num_creditos_seleccion ) {
    AsignaturaProfesor asignaturaProfesor = new AsignaturaProfesor(this, asignatura, num_creditos_seleccion);
    asignaturas.add(asignaturaProfesor);
    asignatura.getProfesors().add(asignaturaProfesor);
}

public void removeAsignatura(Asignatura asignatura) {
    for (Iterator<AsignaturaProfesor> iterator = asignaturas.iterator();
         iterator.hasNext(); ) {
        AsignaturaProfesor asignaturaProfesor = iterator.next();

        if (asignaturaProfesor.getProfesor().equals(this) &&
            asignaturaProfesor.getAsignatura().equals(asignatura)) {
            iterator.remove();
            asignaturaProfesor.getAsignatura().getProfesors().remove(asignaturaProfesor);
            asignaturaProfesor.setProfesor(null);
            asignaturaProfesor.setAsignatura(null);
        }
    }
}

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    Profesor profesor = (Profesor) o;
    if (profesor.id == null || id == null) {
        return false;
    }
    return Objects.equals(id, profesor.id);
}

@Override
public int hashCode() {
    return Objects.hashCode(id);
}

public int compareTo(Profesor o) {
    if (prioridad < o.prioridad) {
        return -1;
    }
    if (prioridad > o.prioridad) {
        return 1;
    }
    return 0;
}
}

AsignaturaProfesorId.java

@Entity
@Table(name=asignatura_profesor)

public class AsignaturaProfesor implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId
public AsignaturaProfesorId profasigpk;

@NotNull
@Column (name = num_creditos)
private  Long num_creditos;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId(id_profesor)
private Profesor profesor;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId(id_asignatura)
private Asignatura asignatura;

public AsignaturaProfesor() {
}

public AsignaturaProfesor(AsignaturaProfesorId profAsigpk, Long num_creditos) {
    this.profasigpk = profAsigpk;
    this.num_creditos = num_creditos;
}

public AsignaturaProfesor(Profesor profesor, Asignatura asignatura, long num_creditos){
    this.profesor = profesor;
    this.asignatura = asignatura;
    this.num_creditos = num_creditos;
}

//GETTER AND SETTER

@Override
public boolean equals(Object o) {
    if (this == o) return true;

    if (o == null || getClass() != o.getClass())
        return false;

    AsignaturaProfesor that = (AsignaturaProfesor) o;
    return Objects.equals(profesor, that.asignatura) &&
        Objects.equals(asignatura, that.profesor);
}

@Override
public int hashCode() {
    return Objects.hash(profesor, asignatura);
}

@Override
public String toString() {
    return AsignaturaProfesor{ +
        profAsigpk= + profasigpk +
        '}';
}

}

ProfesorAsignatura.java

@Entity
@Table(name=asignatura_profesor)

public class AsignaturaProfesor implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId
public AsignaturaProfesorId profasigpk;

@NotNull
@Column (name = num_creditos)
private  Long num_creditos;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId(id_profesor)
private Profesor profesor;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId(id_asignatura)
private Asignatura asignatura;



public AsignaturaProfesor() {
}

public AsignaturaProfesor(AsignaturaProfesorId profAsigpk, Long num_creditos) {
    this.profasigpk = profAsigpk;
    this.num_creditos = num_creditos;
}

public AsignaturaProfesor(Profesor profesor, Asignatura asignatura, long num_creditos){
    this.profesor = profesor;
    this.asignatura = asignatura;
    this.num_creditos = num_creditos;
}

public AsignaturaProfesorId getProfAsigpk() {
    return profasigpk;
}

public void setProfAsigpk(AsignaturaProfesorId profAsigpk) {
    this.profasigpk = profAsigpk;
}

public Long getNum_creditos() {
    return num_creditos;
}

public void setNum_creditos(Long num_creditos) {
    this.num_creditos = num_creditos;
}

public Profesor getProfesor() {
    return profesor;
}

public void setProfesor(Profesor profesor) {
    this.profesor = profesor;
}

public Asignatura getAsignatura() {
    return asignatura;
}

public void setAsignatura(Asignatura asignatura) {
    this.asignatura = asignatura;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;

    if (o == null || getClass() != o.getClass())
        return false;

    AsignaturaProfesor that = (AsignaturaProfesor) o;
    return Objects.equals(profesor, that.asignatura) &&
        Objects.equals(asignatura, that.profesor);
}

@Override
public int hashCode() {
    return Objects.hash(profesor, asignatura);
}

@Override
public String toString() {
    return AsignaturaProfesor{ +
        profAsigpk= + profasigpk +
        '}';
} 

Dank, wenn jemand kann mir helfen.

Veröffentlicht am 20/10/2018 um 12:40
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Nun wird der Code mit der @codeLover Antwort runing geändert , wie ich in seiner Antwort kommentieren , aber wenn ich hole gesetzt = FetchType.EAGER auf Profesor.java ich Stackoverflow und wenn ich hole gesetzt = FetchType.LAZY dann kann ich
Page<Profesor> page = profesorRepository.findAll(pageable); mich alle ohne asignaturas Liste , die jeder profesor haben. Also, ich weiß nicht , wie ich kann alle profesors zu bekommen mit all ihren Bereichen gehören asignaturas Liste von jedem

Profesor.java

@OneToMany(
mappedBy = "profesor",
cascade = CascadeType.ALL,
fetch=FetchType.EAGER,
orphanRemoval = true
)
private List<AsignaturaProfesor> asignaturas = new ArrayList<>();
Beantwortet am 21/10/2018 um 00:50
quelle vom benutzer

stimmen
0

Es liegt daran , während der Angabe @ManyToOneBeziehung , die Sie nicht die Spaltennamen zu erwähnen , die als Fremdschlüssel wirken daher Hibernate ist der Fremdschlüsselname unter der Annahme , nach seiner Konvention, so werden Sie dieses Problem gegenüber . Versuche dies:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(referencedColumnName = "id",name = "id_profesor", insertable=false, updatable=false)
private Profesor profesor;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(referencedColumnName = "id",name = "id_asignatura", insertable=false, updatable=false)
private Asignatura asignatura;
Beantwortet am 20/10/2018 um 13:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more