Próbuję wykonać aplikację internetową na małą szkołę jazdy przy użyciu bootka. W tym czasie staram się utworzyć tabele, które wykorzystują klucze obce: student będzie miał wiele ocen, więc robię 1: N stowarzyszenia. Problem polega na tym, kiedy próbuję uruchomić projekt do testowania, uzyskuję ten błąd (tylko zamierzam położyć przyczynę):

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property rut found for type ResultadosPsicotecnicos!

Zrobiłem niestandardową metodę do pobrania wszystkich ocen ucznia, ale z jakiegoś powodu nie działa. Spojrzałem w bazę danych, aby sprawdzić, czy faktycznie utworzono kolumnę i jest to kod, który widziałem:

-- Table: public.resultados_psicotecnicos

-- DROP TABLE public.resultados_psicotecnicos;

CREATE TABLE public.resultados_psicotecnicos
(
    id bigint NOT NULL,
    fecha_evaluacion character varying(255) COLLATE pg_catalog."default",
    nota1 character varying(255) COLLATE pg_catalog."default",
    nota2 character varying(255) COLLATE pg_catalog."default",
    nota3 character varying(255) COLLATE pg_catalog."default",
    nota4 character varying(255) COLLATE pg_catalog."default",
    rut bigint NOT NULL,
    CONSTRAINT resultados_psicotecnicos_pkey PRIMARY KEY (id),
    CONSTRAINT fkf57g1daekqxergtw9kck81esq FOREIGN KEY (rut)
        REFERENCES public.students (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

TABLESPACE pg_default;

ALTER TABLE public.resultados_psicotecnicos
    OWNER to postgres;

Jestem nowy w tym ramie, więc może błąd jest oczywisty, ale go nie widzę. Teraz pokażę zajęcia i repozytoria.

Oto struktura projektu:

enter image description here

Application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.show-sql=true
spring.datasource.driver-class-name=org.postgresql.Driver

## Hibernate Propierties
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL94Dialect

# Hibernate auto ddls
spring.jpa.hibernate.ddl-auto = create

Student.java.

package net.BBB.ProjectB.entity;


import java.sql.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "students")
public class Student {

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

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "nombre")
    private String nombre;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "nacionalidad")
    private String nacionalidad;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "edad")
    private long edad;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "rut")
    private String rut;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "sexo")
    private String sexo;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "fecha_nacimiento")
    private Date fecha_nacimiento;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "domicilio")
    private String domicilio;

    @NotBlank(message = "Este campo es obligatorio")
    @Column(name = "email")
    private String email;

    @NotNull(message = "Este campo es obligatorio")
    @Column(name = "telefono")
    private long telefono;

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
    private Set<ResultadosPsicotecnicos> resultadosPsicotecnicos;

   /* constructors, getters and setters ommited */

Nie myl tego rut u studenta z jednym w Resultadospsicotecnicos.

ResultadospsicoteCnicos.java.

package net.BBB.ProjectB.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "Resultados_Psicotecnicos")
public class ResultadosPsicotecnicos {

    @Id
    @Column(name = "id")
    private long id;

    @ManyToOne
    @JoinColumn(name = "rut", nullable = false, referencedColumnName = "id")
    private Student student;

    private String fecha_evaluacion;

    private String nota1;

    private String nota2;

    private String nota3;

    private String nota4;

    public ResultadosPsicotecnicos() {}

    public ResultadosPsicotecnicos(Student student) {
        this.student = student;
    }

    /* getters and setters ommited */

SessadospsicotecnicosRepository.java.

package net.BBB.ProjectB.repository;

import java.util.List;

import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.EntityGraph.EntityGraphType;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import net.BBB.ProjectB.entity.ResultadosPsicotecnicos;

@Repository
public interface ResultadosPsicotecnicosRepository extends CrudRepository<ResultadosPsicotecnicos, Long> {

    @EntityGraph(value = "Student.resultadosPsicotecnicos", type = EntityGraphType.FETCH)
    List<ResultadosPsicotecnicos> findByRut(long rut);

}

Tutaj na końcu jest metoda niestandardowa, która powoduje błędy. Zamierzam użyć id ucznia, później, jeśli naprawię to, użyję rut, ale na razie kolumna klucza obcego jest nazywana rut Wykorzystuje ucznia id.

Każda pomoc jest mile widziana.

0
B. A. C. A. 21 marzec 2020, 17:26

1 odpowiedź

Najlepsza odpowiedź

Właściwie, JPA próbuje znaleźć kolumnę Rut w Resultadospsicotecnicos, jak określono FindByrut w ResultadospsicoteCnicosorStors.

  1. Zmodyfikuj FindByrut w ResultadospSicoteCnicosRePository jak poniżej, ponieważ trzeba określić nazwę obiektu podmiotu w repozytorium JPA, a nie nazwy kolumny DB Lista findbystudent_id (długi student);

  2. Alternatywnie możesz wypróbować poniższe rozwiązanie. Aby uzyskać listę Resultospsicotecnicos dla konkretnego ucznia, musisz dodać poniższą metodę w StudentRepository

@Entitygraph (Value = "Student.resultadospsicotecnicos", Type = EntityGraphtyPe.fetch) Student Flowbyd (długi ID); A na szczycie swojej klasy studenckiej należy dodać poniższą linię @ jaedentitygraph (nazwa = "student

0
sandeep 21 marzec 2020, 17:44