OK aqui vai,
Estou assumindo que você está construindo seu aplicativo com Spring Boot, Hibernate como seu ORM e provavelmente algum tipo de banco de dados relacional (MySQL).
Em relação ao design do banco de dados:
Sim, o objeto Patreon aqui é a entidade proprietária com uma relação OneToMany com a entidade Item (já que um Patreon pode ter N objetos). Sua entidade Patreon pode fazer o seguinte redesenho:
1) Tente usar tipos não primitivos especialmente para chaves de tabela (long id -> Long id).
2) Perca o array de checkOutItems, bem como a lista itemHistory. Em primeiro lugar, as relações devem ser modeladas usando coleções e não arrays. Em segundo lugar, você não precisa desses dois. Você nunca armazenará os checkOutItems nem o itemHistory dessa maneira. Em vez disso, crie um
List<Item> items
que armazenará os itens do Patreon enquanto descreve a relação (aqui estão alguns exemplos:http:/ /www.baeldung.com/hibernate-one-to-many
) 3) Novamente com a entidade Item você precisa perder o array do histórico. A única coisa que você precisa é uma referência à entidade proprietária (Patreon neste caso), completando assim o lado MuitosParaUm da relação.
4) Observe que os campos Data devem ser anotados com
@Temporal
também fornecendo o tipo correto (você pode ler mais). 5) A classe de itens em geral deve ser reformulada.
5) Depois que todos os itens acima estiverem em vigor e assumindo que você está usando Spring, você pode criar um Repositório com o qual você pode consultar um objeto Patreon, recuperando assim um objeto junto com suas entidades relacionadas (Itens).
Sobre suas dúvidas:
Q1:Sim, veja. Veja acima para mais.
Q1.2:Nenhuma matriz não é. Listas ou melhor ainda Conjuntos são mais adequados.
Q1.3:Sim, existe. A primeira uma anotação JPA usada em bancos de dados relacionais enquanto a segunda é uma anotação específica Spring Data usada por bancos de dados e frameworks que não são desse tipo (relacionais) ou não possuem uma API de persistência padrão definida (como JPA). Pois o NonNull e NotNull são aproximadamente os mesmos com o primeiro superdefinindo o último (algo que é feito com frequência). A única diferença que vejo é o alvo. Você pode ler mais aqui:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/lang/NonNull.html https://docs.oracle.com/javaee /7/api/javax/validation/constraints/NotNull.html
Q2:Sim, existe. Veja acima.
Q3:Com um pouco de design inteligente, não vejo necessidade de mais, mas se você acha que vai te ajudar, por que não. Só não exagere no design e é complexidade