Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] 1. Defina entidades e relacionamento

Algum Orientador poderia corrigir ve se está certo essa primeira parte

package com.alura.TesteUmAlura.infraectruture.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

// Estou usando biblioteca lombok para facilitar as criações de getters setters e construtotes
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
// Estou mostrando ao JPa/Hibernate que essa classe representa uma tabela no banco de dados
@Entity
// definindo o nome da tabela
@Table(name = "sala")

public class SalaEntity {

    //Criando um Id da tabela que gera automatico
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // criando uma coluna para ter a capacidade de alunos defini como intereger
    // porque estou imaginando que pode aumentar a capacidade ou diminuir
    // dependendo da demanda
    @Column(name = "capacidade")
    private Integer capacidade;
}

package com.alura.TesteUmAlura.infraectruture.entity;


import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

// Estou usando biblioteca lombok para facilitar as criações de getters setters e construtotes
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
// Estou mostrando ao JPa/Hibernate que essa classe representa uma tabela no banco de dados
@Entity
@Table(name = "usuarios")
public class UsuarioEntity {

    //Criando um Id da tabela que gera automatico
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Criando uma coluna com nome do usuario
    @Column(name = "nome", length = 150)
    private String nome;


    // Criando uma coluna com email do usuario
    @Column(name = "email", length = 200)
    private String email;
}


package com.alura.TesteUmAlura.infraectruture.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;

// Estou usando biblioteca lombok para facilitar as criações de getters setters e construtotes
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
// Estou mostrando ao JPa/Hibernate que essa classe representa uma tabela no banco de dados
@Entity
// definindo o nome da tabela
@Table(name = "Reserva")
public class ReservaEntity {

    //Criando um Id da tabela que gera automatico
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Criando uma coluna com inicio da reserva
    @Column(name = "dataInicio")
    private LocalDate dataInicio;

    // Criando uma tabela com fim da reserva
    @Column(name = "dataFim")
    private LocalDate dataFim;


    // Criando uma uma coluna e relacionando com id do usuario caso ele reserve
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "usuarioId", referencedColumnName = "id")
    private UsuarioEntity usuario;


    // Criando uma coluna com e relacionando com id da sala que está ou sera reservada
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "sala_id", referencedColumnName = "id")
    private SalaEntity sala;


}

se tiver algum jeito melhor de eu mandar meu código aceito sugestões

2 respostas
solução!

Oi, Felipe! Como vai?
Agradeço por compartilhar seu código com a comunidade Alura.

Curti o uso do Lombok e das anotações do JPA. Trouxe alguns pontos pra melhorar ainda mais:

  • Relacionamentos: Reserva tende a ser @ManyToOne tanto para Usuario quanto para Sala, já que várias reservas podem existir para um mesmo usuário e também para a mesma sala.
  • Cascade: evite usar cascade = ALL nesses vínculos para não excluir usuário ou sala quando apagar uma reserva.
  • Padronização: use nomes de tabela e colunas em minúsculas, como reserva, data_inicio e usuario_id.
  • Pacote: revise o nome infraectruture para infrastructure.
  • Validação: adicione nullable = false em campos obrigatórios para maior consistência no banco.

Uma dica interessante para o futuro é usar @ManyToOne com fetch = FetchType.LAZY e nomes consistentes. Por exemplo:


@Entity
@Table(name = "reserva")
public class ReservaEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "data_inicio", nullable = false)
    private LocalDate dataInicio;

    @Column(name = "data_fim", nullable = false)
    private LocalDate dataFim;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "usuario_id", nullable = false)
    private UsuarioEntity usuario;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sala_id", nullable = false)
    private SalaEntity sala;
}

O código mapeia relacionamentos muitos-para-um e evita que excluir uma reserva remova usuario ou sala.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Boa tarde Rafaela, tudo bem comigo e a senhorita ?

Ah vi respondeu bem rápido estava alterando e com sua respostas já ajudou bastante fiz até algumas alterações tipo criei uma regra de negocio para que a data final seja 20 dias depois ao começo da data inicial e fiz alterações que a senhorita propôs muito obrigado segue abaixo

package com.alura.TesteUmAlura.infrastructure.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;

// Estou usando biblioteca lombok para facilitar as criações de getters setters e construtotes
@Getter
@Setter
@NoArgsConstructor

// Estou mostrando ao JPa/Hibernate que essa classe representa uma tabela no banco de dados
@Entity
// definindo o nome da tabela
@Table(name = "Reserva")
public class ReservaEntity {

    //Criando um Id da tabela que gera automatico
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Criando uma coluna com inicio da reserva
    @Column(name = "data_inicio", nullable = false)
    private LocalDate dataInicio;

    // Criando uma tabela com fim da reserva
    @Column(name = "data_fim", nullable = false)
    private LocalDate dataFim;


    // Criando uma uma coluna e relacionando com id do usuario caso ele reserve
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "usuario_id", referencedColumnName = "id", nullable = false)
    private UsuarioEntity usuario;


    // Criando uma coluna com e relacionando com id da sala que está ou sera reservada
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sala_id", referencedColumnName = "id", nullable = false)
    private SalaEntity sala;


    // Criei um construtor para ter uma regra de negocio que a
    // data inicial não pode ser nula e a data fim seja 20 dias apos a data inicio
    // foi criado essa regra de negocio na entidade para definir que toda vez que
    // criar um atributo datafim será apos 20 dias data inicio
    public ReservaEntity(LocalDate dataInicio, UsuarioEntity usuario, SalaEntity sala) {

        if (dataInicio == null || dataInicio.isBefore(LocalDate.now())){

                throw new IllegalArgumentException("A data tem que ser preenchida " +
                        "e não pode ser no passado");

        }


        this.dataInicio = dataInicio;
        // Uma regra de negocio para o atributo começar 20 apos a data inicio
        this.dataFim = dataInicio.plusDays(20);
        this.usuario = usuario;
        this.sala = sala;

    }
}