Olá,
Eu vim do PHP e não tenho muita experiência com hibernate e estou com um problema no relacionamento entre tabelas,
Não posso mostrar as tabelas aqui da empresa então criei uma situação parecida com a daqui, a situação fictícia é um controle de consumo de créditos de ligações telefonicas de vários clientes:
Eu possuo a seguinte estrutura de banco de dados: (modelo1.png)
e criei as seguintes entidades:
//Retirei os getters e setters para não ocupar muito espaço.
public class Cliente {
@Id
@GeneratedValue
private Long id;
private String cnpj;
private String nome;
@ManyToOne
@JoinColumn(name="cliente_pai_id")
private Cliente clientePai;
}
public class Contrato implements DomainObject {
@Id
@GeneratedValue
private Long id;
@NotEmpty
private String numero;
@ManyToOne
@JoinColumn(name="cliente_id")
private Cliente cliente;
}
public class Credito implements DomainObject {
@Id
@GeneratedValue
private Long id;
private Long quantidade;
@ManyToOne
@JoinColumn(name="contrato_id")
private Contrato contrato;
@ManyToOne
@JoinColumn(name="tipo_id")
private Tipo tipo;
@NotNull
@ManyToOne
@JoinColumn(name="cliente_id")
private Cliente cliente;
}
public class Tipo implements DomainObject {
@Id
@GeneratedValue
private Long id;
private String nome;
private Long creditosPorMinuto;
}
As seguintes regras:
- Um cliente pode ter várias filiais.
- Um cliente matriz pode ter um ou vários contratos e as filiais herdam todos os contratos da matriz.
- Um cliente filial pode ter seu próprio contrato que não pode ser visto pela matriz.
- Um contrato deve definir a quantidade máxima de créditos que podem ser contratados por tipo de crédito, matriz e filial(filiais podem ter limite diferente da estabelecida pela matriz).
- O crédito pode ser transferido entre a filial e matriz, quando a matriz transfere créditos para uma filial, conta como se tivesse utilizado pela matriz.
Como deve ficar: (duvida.png)
Do jeito que esta funciona até certo ponto, pois não consigo trazer todos os clientes que utilizam o contrato 1 por exemplo, pois a tabela contrato não esta relacionada com os clientes filhos diretamente, somente pela tabela créditos. Não sei se a causa é falta de relacionamento bidirecional, mas deixo esta como última opção pois não sei o impacto de performance que isto causaria.
Acho que meu problema esta na abstração dos objetos, podem me ajudar?
De preferência preciso seguir esta estrutura de tabela, mas se não tiver jeito posso redesenha-los.



