Hibernate не правильно строит запрос - PullRequest
0 голосов
/ 20 октября 2018

У меня проблема, когда я делаю запрос к своему репо с Page page = entityRepository.findAll (pageable).Итак, я не знаю, почему, когда hibernate строит запрос, он делает это как asignatura_id и profesor_id в сущности asignaturaProfesor, если его id является объектом из сущности AsignaturaProfesorId, а это поля id_profesor и id_asignatura

Я получаю эту ошибку:

Hibernate: выберите profesor0_.id в качестве id1_8_, profesor0_.categoria в качестве категорий_2_, profesor0_.cod_profesor в качестве cod_prof3_8_, profesor0_.email в качестве email4_8_, prof_se_0_0_0_0_0_0_0_0_0_0_0_0_0_0_7.num_creditos_impartir в num_cred7_8_, profesor0_.primer_apellido как primer_a8_8_, profesor0_.prioridad как priorida9_8_, profesor0_.segundo_apellido как segundo10_8_, profesor0_.usu_alta как usu_alt11_8_ от Profesor profesor0_

1007 *
> Hibernate: выберите asignatura0_.profesor_id в profesor4_1_0_,asignatura0_.fecha_seleccion as fecha_se1_1_0_, asignatura0_.asignatura_id as asignatu3_1_0_, asignatura0_.fecha_seleccion as fecha_se1_1_1_, asignatura0_.asignatura_id asignatu3_1_1_, asignatura0_.profesor_id в качестве profesor4_1_1_, asignatura0_.num_creditos в виде num_cred2_1_1_ из asignatura_profesor asignatura0_, где asignatura0_.profesor_id =? * 1001. * 0.91-й.SqlExceptionHelper: Ошибка SQL: 1054, SQLState: 42S22 ОШИБКА 19148 --- [XNIO-2 task-8] ohengine.jdbc.spi.SqlExceptionHelper: Неизвестный столбец 'asignatura0_.profesor_id' в 'списке полей'

Это моя схема базы данных:

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

Это мой код:

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

спасибо, если кто-то может мне помочь.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Теперь код выполняется с измененным ответом @codeLover, как я комментирую в его ответе, но если я устанавливаю fetch = FetchType.EAGER в Profesor.java, я получаю StackOverflowError, и если я устанавливаю fetch = FetchType.LAZY, тогда я делаю
Page<Profesor> page = profesorRepository.findAll(pageable); Я получаю все без списка asignaturas, который есть у каждого профессора.Итак, я не знаю, как я могу получить от всех профессоров со всеми их полями список асингуатур от каждого

Profesor.java

@OneToMany(
mappedBy = "profesor",
cascade = CascadeType.ALL,
fetch=FetchType.EAGER,
orphanRemoval = true
)
private List<AsignaturaProfesor> asignaturas = new ArrayList<>();
0 голосов
/ 20 октября 2018

Это потому, что при указании отношения @ManyToOne вы не упоминаете имена столбцов, которые действуют как внешний ключ, поэтому hibernate принимает имя внешнего ключа в соответствии со своим соглашением, таким образом, вы столкнулись с этой проблемой.Попробуйте это:

@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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...