Сообщение об ошибке при использовании @OneToMany и @ManyToOne в моем API Springboot - PullRequest
1 голос
/ 05 октября 2019

Приложение имеет три класса Cargos (должности), Funcionarios (сотрудники) и Salario (зарплата). Когда я регистрирую сотрудника, ему нужна зарплата и должность. У меня есть два работающих контролера, один для сотрудника и один для должностей, но мне нужно, чтобы они имели связь между ними.

Вот класс Funcionarios (сотрудников):

  package name of the package;

import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

@Entity
public class Funcionarios {

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

    @NotNull
    private String nome;
    @NotNull
    private String email;
    @NotNull
    private Date nascimento;
    @NotNull
    private Date dataAdmissao;

    public Long getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public String getEmail() {
        return email;
    }

    public Date getNascimento() {
        return nascimento;
    }

    public Date getDataAdmissao() {
        return dataAdmissao;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setNascimento( Date nascimento) {
        this.nascimento = nascimento;
    }

    public void setDataAdmissao(Date dataAdmissao) {
        this.dataAdmissao = dataAdmissao;
    }

}

Вот класс Cargos (должностей):

package name of the package;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Cargos implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ManyToOne
    @JoinColumn(name = "id")
    private Funcionarios id;

    private String descricao;
    private double valor;
    private double gratificacaoTeto;
    private LocalDateTime dataCriacao = LocalDateTime.now();

    public Funcionarios getId() {
        return id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setId(Funcionarios id) {
        this.id = id;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public void setGratificacaoTeto(double gratificacaoTeto) {
        this.gratificacaoTeto = gratificacaoTeto;
    }

    public void setDataCriacao(LocalDateTime dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public double getValor() {
        return valor;
    }

    public double getGratificacaoTeto() {
        return gratificacaoTeto;
    }

    public LocalDateTime getDataCriacao() {
        return dataCriacao;
    }

}

Вот класс Salarios (оклад)

package package name of the package;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Salarios {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @ManyToOne
    @JoinColumn(name = "id")
    private Funcionarios id;

    private int data;
    private double gratificacao;

    @ManyToOne
    private Cargos cargos;

    @ManyToOne
    private Funcionarios funcionario;

    public Funcionarios getId() {
        return id;
    }

    public void setId(Funcionarios id) {
        this.id = id;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public double getGratificacao() {
        return gratificacao;
    }

    public void setGratificacao(double gratificacao) {
        this.gratificacao = gratificacao;
    }

    public Cargos getCargos() {
        return cargos;
    }

    public void setCargos(Cargos cargos) {
        this.cargos = cargos;
    }

    public Funcionarios getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionarios funcionario) {
        this.funcionario = funcionario;
    }

}

Если это поможет, вот таблицы и как они должны быть в базе данных:

Когда я пытаюсьиспользовать onetomay и manytoone Springboot Я получаю следующую ошибку:

Ошибка запуска ApplicationContext. Чтобы отобразить отчет об условиях, перезапустите приложение с включенной отладкой. 2019-10-05 17: 04: 50.314 ОШИБКА 6716 --- [restartedMain] osboot.SpringApplication
: сбой запуска приложения

org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'entityManagerFactory ', определенный в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]: сбой вызова метода init;вложенным исключением является org.hibernate.AnnotationException: внешний ключ, ссылающийся на name.of.package.Funcionarios из name.of.package.Cargos имеет неправильный номер столбца. должно быть 0 в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1778) ~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.rame.be. .factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:593) ~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в орг. AbstractAutowireCapableBeanFactory.java:515) ~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFact3): 3~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) ~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) ~ [spring-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) ~ [весна-beans-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1105) ~ [spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:867) ~ [spring-context-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.spring. context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:549) ~ [spring-context-5.1.10.RELEASE.jar: 5.1.10.RELEASE] в org.springframework.boot.web.servlet.context.ServletWebServerApplication(ServletWebServerApplicationContext.java:141) ~ [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:744) [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] на org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:391) [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:312) [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] в org.springframework.boot. SpringApplication.run (SpringApplication.java:1215) [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] вorg.springframework.boot.SpringApplication.run (SpringApplication.java:1204) [spring-boot-2.1.9.RELEASE.jar: 2.1.9.RELEASE] по адресу name.of.package.BolsasApplication.main (BolsasApplication.java:13) [classes /: na] в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_221] в sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) ~ [na: 1.8.0_221] в sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) ~ [na: 1.8.0_221] at java.lang.reflect.Method.invoke (неизвестный источник) ~ [na: 1.8.0_221]

1 Ответ

0 голосов
/ 06 октября 2019

Мне было бы лучше, если бы вам нужно было указывать зарплату только по сотруднику. Одновременно моделировать двунаправленные отношения в ваших сущностях в качестве ссылочных объектов или коллекций гораздо сложнее.

То, как вы это определили, не работает, поскольку id не может быть одновременно первичным сгенерированным столбцом и внешним ключом.

Возможно: https://www.javaworld.com/article/2077819/understanding-jpa-part-2-relationships-the-jpa-way.html?page=2 помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...