Olá, Lucas
O JPA/Hibernate permite que você crie relações entre suas entidades de maneira bastante flexível.
Vamos pensar em um exemplo prático considerando as entidades que você mencionou: Cliente, Contrato, Itens e Categoria dos Itens.
Cliente: Esta é uma entidade simples que pode conter informações como nome, endereço, etc.
Item: Esta entidade pode ter atributos como nome, descrição, quantidade em estoque e Categoria. A Categoria pode ser uma entidade separada com uma relação de muitos para um (ManyToOne) com Item.
Contrato: Aqui as coisas ficam um pouco mais complexas. Você pode ter um relacionamento de muitos para um (ManyToOne) com Cliente, indicando que um Cliente pode ter vários Contratos. Além disso, você pode ter um relacionamento de muitos para muitos (ManyToMany) com Item, indicando que um Contrato pode ter vários Itens e um Item pode estar em vários Contratos. Para armazenar a quantidade de cada Item em um Contrato, você pode usar uma tabela de junção com uma coluna extra para a quantidade.
Para controlar o estoque, você pode ter um atributo na entidade Item que armazena a quantidade atual em estoque. Cada vez que um Contrato é criado ou modificado, você atualiza essa quantidade. No entanto, essa atualização deve levar em conta a data do evento. Ou seja, o estoque só deve ser diminuído na data do evento.
Aqui está um exemplo simplificado de como as entidades poderiam ser mapeadas:
@Entity
public class Cliente {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nome;
// outros atributos...
}
@Entity
public class Categoria {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nome;
// outros atributos...
}
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nome;
private int quantidadeEmEstoque;
@ManyToOne
private Categoria categoria;
// outros atributos...
}
@Entity
public class Contrato {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private LocalDate dataDoEvento;
@ManyToOne
private Cliente cliente;
@ManyToMany
@JoinTable(
name = "contrato_item",
joinColumns = @JoinColumn(name = "contrato_id"),
inverseJoinColumns = @JoinColumn(name = "item_id")
)
private Map<Item, Integer> itens = new HashMap<>();
// outros atributos...
}
``
Espero ter ajudado e bons estudos!