Свойство Not-null ссылается на временное значение Hibernate

У меня есть две таблицы с отношениями 1 : n

Многие к одному сотрудники и отдел сотрудник может иметь только один отдел.

Один ко многим а в отделе несколько сотрудников.

В таблице отделов уже есть созданные отделы, новый отдел не нужно создавать для добавления сотрудника (только тот, который существует)

Моя модель: Funcionario / многие к одному

@Entity(name = "Funcionario")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo", length = 1, discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("F")
@Table(name = "funconarios")
public abstract class Funcionario implements Autenticar {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "codFuncionario")
    private String codFuncionario;

    @ManyToOne  
    @JoinColumn(name = "codDepart", referencedColumnName = "codDepart",nullable=false)  
    private Departamento departamento;

    //private Endereco endereco;
    @Column(name = "matricula")
    private String matricula;
    @Column(name = "nome")
    private String nome;
    @Column(name = "cpf")
    private String cpf;
    @Column(name = "rg")
    private String rg;
    @Column(name = "usuario")
    private String usuario;
    @Column(name = "senha")
    private String senha;
    @Column(name = "dataEntrada")
    private Date dataEntrada; 
    @Column(name = "dataSaida")
    private Date dataSaida;
    @Column(name = "dataNascimento")
    private Date dataNascimento;
    @Column(name = "salario")
    private Double salario;

//construtores  
    public Funcionario() {
    }

моя модель ОТДЕЛ / один ко многим:

@Entity
@Table(name = "departamento") 
public class Departamento {
    @Id  
    @GeneratedValue  
    @Column(name = "codDepart") 
    private Integer codDepartamento;
    @Column(name = "nome")  
    private String nomeDepartamento;

    @OneToMany(mappedBy = "departamento", cascade= CascadeType.ALL)  
    private Set<Funcionario> funcionarios;  

    public Departamento() {
    }

    public Integer getCodDepartamento() {
        return codDepartamento;
    }

    public void setCodDepartamento(Integer codDepartamento) {
        this.codDepartamento = codDepartamento;
    }

    public String getNomeDepartamento() {
        return nomeDepartamento;
    }

    public void setNomeDepartamento(String nomeDepartamento) {
        this.nomeDepartamento = nomeDepartamento;
    }

    @Override
    public String toString() {
        return "Departamento [codDepartamento = " + codDepartamento + ", nomeDepartamento = " + nomeDepartamento
                + ", funcionarios = " + funcionarios + "]";
    }



}

мой метод сохранения:

public void save(T entity) {
    getSession().saveOrUpdate(entity);
}

мой основной:

public static void main(String[] args) {
    Departamento depart = new Departamento();
    Funcionario funcionario = new Vendedor();
    funcionario.setNome("Maria");
    funcionario.setCpf("11111111111");
    funcionario.setRg("2222222222");
    funcionario.setMatricula("124");
    funcionario.setDataNascimento(java.sql.Date.valueOf("2005-02-01"));
    funcionario.setDataEntrada(java.sql.Date.valueOf("2005-02-01"));
    funcionario.setSalario(987.00);
    funcionario.setUsuario("xd");
    funcionario.setSenha("xd");
    Departamento departamento = new Departamento();
    departamento.setNomeDepartamento("teste");
    funcionario.setDepartamento(departamento);

    GenericDAO absx = new DepartamentoDAO(Funcionario.class);
    absx.beginTransaction();
    absx.save(funcionario);
    absx.commit();

}

мой стек ошибок:

WARN: HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. 
The unsaved transient entity must be saved in an operation prior to saving these dependent entities.  
Unsaved transient entity: ([model.Departamento#<null>])   Dependent entities: ([[model.Vendedor#<null>]])     
Non-nullable association(s): ([model.Vendedor.departamento]) Exception in thread "main"
org.hibernate.TransientPropertyValueException: Not-null property
references a transient value - transient instance must be saved before
current operation : model.Vendedor.departamento -> model.Departamento

at org.hibernate.action.internal.UnresolvedEntityInsertActions.checkNoUnresolvedActionsAfterOperation(UnresolvedEntityInsertActions.java:122)

at org.hibernate.engine.spi.ActionQueue.checkNoUnresolvedActionsAfterOperation(ActionQueue.java:436)

at org.hibernate.internal.SessionImpl.checkNoUnresolvedActionsAfterOperation(SessionImpl.java:651)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:683)

at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:673)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:668)

at dao.GenericDAO.save(GenericDAO.java:54)
at view.eeee.main(eeee.java:35)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 843
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны каскадировать изменения. Место в своем Funcionario классе:

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "codDepart", referencedColumnName = "codDepart",nullable=false)  
private Departamento departamento;

а в моем классе это нужно?

Joao Spirit 29.07.2019 12:14

@OneToMany(mappedBy = "departamento", cascade= CascadeType.ALL)

Joao Spirit 29.07.2019 12:14

Другие вопросы по теме