hibernace není správně sestavit dotaz

hlasů
0

Mám problém, když mám dotaz mého repo stránkou page = entityRepository.findAll (stránkovaného). Takže nevím, proč se při režimu spánku stavět dotazu toto to takhle asignatura_id a profesor_id v těchto společnostech asignaturaProfesor pokud jeho id je objekt z AsignaturaProfesorId subjektu a tato pole jsou id_profesor a id_asignatura

Mám tuto chybu:

Přezimují: vyberte profesor0_.id as id1_8_, profesor0_.categoria jako categori2_8_, profesor0_.cod_profesor as cod_prof3_8_, profesor0_.email jako email4_8_, profesor0_.login jako login5_8_, profesor0_.nombre jako nombre6_8_, profesor0_.num_creditos_impartir jako num_cred7_8_, profesor0_.primer_apellido jako primer_a8_8_ , profesor0_.prioridad as priorida9_8_, profesor0_.segundo_apellido jako segundo10_8_, profesor0_.usu_alta as usu_alt11_8_ od profesora profesor0_

> Režim spánku: vyberte asignatura0_.profesor_id as profesor4_1_0_, asignatura0_.fecha_seleccion jako fecha_se1_1_0_, asignatura0_.asignatura_id as asignatu3_1_0_, asignatura0_.fecha_seleccion as fecha_se1_1_1_, asignatura0_.asignatura_id as asignatu3_1_1_, asignatura0_.profesor_id as profesor4_1_1_, asignatura0_.num_creditos jako num_cred2_1_1_ z asignatura_profesor asignatura0_ kde asignatura0_ .profesor_id =?

WARN 19148 --- [XNIO-2 úkol-8] ohengine.jdbc.spi.SqlExceptionHelper: Chyba SQL: 1054, SQLState: 42S22 CHYBA 19148 --- [XNIO-2 úkol-8] ohengine.jdbc.spi.SqlExceptionHelper: Unknown column 'asignatura0_.profesor_id' in 'field list'

To je můj schématu databáze:

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

To je můj kód:

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 +
        '}';
} 

Díky, pokud někdo mi může pomoci.

Položena 20/10/2018 v 12:40
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Nyní je kód runing s @codeLover odpověď modifikované, jako bych vyjádřit ve své odpovědi, ale když jsem nastavit načíst = FetchType.EAGER na Profesor.java získám StackOverflowError a když jsem nastavit načíst = FetchType.LAZY pak já
Page<Profesor> page = profesorRepository.findAll(pageable); jsem si to vše bez asignaturas seznam, který každý profesor mají. Takže nevím, jak mohu dostat všechny profesors se všemi jejich pole obsahovat seznam asignaturas z každé z nich

Profesor.java

@OneToMany(
mappedBy = "profesor",
cascade = CascadeType.ALL,
fetch=FetchType.EAGER,
orphanRemoval = true
)
private List<AsignaturaProfesor> asignaturas = new ArrayList<>();
Odpovězeno 21/10/2018 v 00:50
zdroj uživatelem

hlasů
0

Je to proto, že když určující @ManyToOnevztah nejste zmínku názvy sloupců, které působí jako cizí klíč, tedy režimu spánku je za předpokladu, že cizí název klíče podle jeho konvence, tak se díváte na tento problém. Zkuste to:

@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;
Odpovězeno 20/10/2018 v 13:15
zdroj uživatelem

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