Estou com uma duvida na implementação da camada de negócio da minha aplicação.
Minha camada de negócio é dividida em 4 pacotes : Service, Repository, Dao, Entity.
O pacote Entity possui minhas classes bean do hibernate.
Entity:@Entity
@Table(name="bovinos")
public class Bovino{
@Id
@SequenceGenerator(name="bovinos_id_bovi_seq", sequenceName="bovinos_id_bovi_seq")
@GeneratedValue(generator="bovinos_id_bovi_seq")
@Column( nullable = false)
private long id_bovi;
@Column(length=6)
private String manejo;
@Column(length=15)
private String sisbov;
....
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.bovino",cascade={CascadeType.ALL})
private List<BovinoNf> BovinosNotaFiscal = new LinkedList<BovinoNf>();
@Entity
@Table(name="bovino_nf")
@AssociationOverrides
({
@AssociationOverride(name = "pk.bovino", joinColumns = @JoinColumn(name = "id_bovi")),
@AssociationOverride(name = "pk.notaFiscal", joinColumns = @JoinColumn(name = "id_nf_bovino"))
})
public class BovinoNf{
private nfBovinosPK pk = new nfBovinosPK();
private String tipo_nota;
@EmbeddedId
private nfBovinosPK getPk() {
return pk;
}
private void setPk(nfBovinosPK pk) {
this.pk = pk;
}
@Transient
public Bovino getBovino(){
return getPk().getBovino();
}
public void setBovino(Bovino bovino){
getPk().setBovino(bovino);
}
@Transient
public NotaFiscalBovino getNotaFiscal(){
return getPk().getNotaFiscal();
}
public void setNotaFiscal(NotaFiscalBovino notaFiscal){
getPk().setNotaFiscal(notaFiscal);
}
public String getTipo_nota() {
return tipo_nota;
}
public void setTipo_nota(String tipo_nota) {
this.tipo_nota = tipo_nota;
}
....
}
class nfBovinosPK implements Serializable {
private Bovino bovino;
private NotaFiscalBovino notaFiscal;
@ManyToOne
public Bovino getBovino() {
return bovino;
}
public void setBovino(Bovino bovino) {
this.bovino = bovino;
}
@ManyToOne
public NotaFiscalBovino getNotaFiscal() {
return notaFiscal;
}
public void setNotaFiscal(NotaFiscalBovino notafiscal) {
this.notaFiscal = notafiscal;
}
...
}
BovinoNf pk = new BovinoNf();
pk.setBovino(bovino);
pk.setNotaFiscal(notafiscalbovino);
pk.setTipo_nota("ENTRADA");
sessao.save(bovino);//salvo o bovino separado
sessao.save(pk); //salvo a nota fiscal separada
Minha classe serviço é a implementação da interface Reporsitory(que recebe um Dao)
@Service(value="BovinoService")
@RemotingDestination
public class BovinoService {
BovinoRepository bovinoRepository;
@Autowired
public void setAlunoRepository(BovinoRepository bovinoRepository){
this.bovinoRepository = bovinoRepository;
}
@Transactional
public void save(Bovino bovino){
bovinoRepository.save(bovino);
}
@Transactional
public void remove(Bovino bovino){
bovinoRepository.remove(bovino);
}
@Transactional
public List<Bovino> findAll(){
return bovinoRepository.findAll();
}
@Transactional
public List<Bovino> findBySisbov(String sisbov){
return bovinoRepository.findByName(sisbov);
}
....
}
Ao salvar um Bovino é necessário que salve na tabela N:N o bovino e a notaFiscal do mesmo, que pode ser de Entrada ou Saida.
Muitas das minhas tabelas do banco de dados possui tabelas N:N com atributo.
Assim necessariamente terei que criar vários métodos na minha classe do tipo Service como :
@Transactional
public void save(Bovino bovino){
alunoRepository.save(bovino);
}
@Transactional
public void save(Bovino bovino,BovinoNf bovinoNf){
bovinoRepository.save(bovino);
bovinoNfRepository.save(bovinoNf);
}
@Transactional
public void save(Bovino bovino,BovinoNf bovinoNf, Peso peso){
bovinoRepository.save(bovino);
bovinoNfRepository.save(bovinoNf);
bovinoNfRepository.save(peso);
}
.....
Só no cadastro de um bovino e alteração possui muitas tabelas N:N com atributo.
Imagina o resto da aplicação...
Como resolver esse problema?