3
respostas

Como eu consigo cria uma relação entre 3 tabelas

Tenho Um protocolo que tem N classificações e a cada classificação atribuída a este protocolo é necessário ou não (0,00) atribuir um custo da classificação. A ideia no Final é de apropriar cada poder contabilizar os valores de cada classificação dos serviços atrelados ao protocolo... No JPA Eu criei uma Classe Protocolo com os atributos a segui:

@Entity
public class Protocolo {

    @Id 
    @ GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Temporal(TemporalType.DATE)
    private Calendar datalancamento = Calendar.getInstance();
    private String descricao;
    private String assunto;
    private String destino;
    private String nomeusuario;
    @OneToMany(fetch=FetchType.EAGER)
    private Set<Atividade> atividades = new HashSet<Atividade>();

Leia-se Atividade os tipos existentes de classificação.

Para Clase da atividade eu criei

@Entity
public class Atividade{

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String nomeatividade;
    @OneToOne(cascade=CascadeType.ALL)
    private Custo custo;

e Para a Classe do Custo eu criei:

@Entity 
public class Custo {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer Id;
private Double custo;

consigo gravar a atividade mas não to conseguindo gravar o custo...

Alguém se habilita a me ajudar...?

3 respostas

Oi Eder,

pelo que atendi a atividade é o relacionamento entre Protocolo e Custo:

Protocolo <--> Atividade <---> Custo

Mexi um pouco na mapeamento do relacionamento Protocolo e Atividade. Dá uma olhada no codigo abaixo:

@Entity
public class Protocolo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Temporal(TemporalType.DATE)
    private Calendar datalancamento = Calendar.getInstance();
    private String descricao;
    private String assunto;
    private String destino;
    private String nomeusuario;

    @OneToMany(mappedBy="protocolo",  fetch = FetchType.EAGER)
    private Set<Atividade> atividades = new HashSet<Atividade>();

A classe Atividade se tornou o "lado forte" do relacionamento com o Protocolo:

@Entity
public class Atividade {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nomeatividade;

    @ManyToOne()
    private Protocolo protocolo;

    @OneToOne(cascade = CascadeType.ALL)
    private Custo custo;

E segue o teste:

        Protocolo protocolo = new Protocolo();
        protocolo.setAssunto("Um assunto");
        protocolo.setDatalancamento(Calendar.getInstance());
        protocolo.setDestino("Um destino");
        protocolo.setNomeusuario("Um usuario");

        Custo custo = new Custo();
        custo.setCusto(100.0);

        Atividade atividade = new Atividade();
        atividade.setNomeatividade("Uma atividade");
        atividade.setCusto(custo);
        atividade.setProtocolo(protocolo);

        EntityManager em = //pega EntityManager;

        em.getTransaction().begin();
        em.persist(protocolo);
        em.persist(atividade); //custo tem cascade
        em.getTransaction().commit();

        em.close();

Olá Nico!

É um prazer realmente vc ter se dado o trabalho de olhar a minha dúvida... Estou contente, pois entrei na formação Java sem saber quase nada e hoje tô aqui tirando dúvidas com o Mestre Steppat...

Bom a relação é esta mesmo Um Protocolo pode ter N Atividades de cada atividade tem o Seu custo para totalizar o custo final daquele protocolo. Vou testar aqui e torno a lhe informar se deu certo..

Como você diz ... "Vamos dar Gás!!"

Diante mão agradeço a atenção dispensada. em breve retorno o contato com o teste e resultado.. Valeu!!!

Oi Nico,

tem um detalhe que é importante... que acabei esquecendo aqui e esta pegando.

é que um protocolo se inicia pela manha e de acordo com o sua atividade gera ou não custo. e este custo só é lançado após a execução ao final do dia.

Ou seja eu lanço as demandas pela manhã e a tarde ou no dia seguinte eu efetuo a baixa no mesmo para encerrar o mesmo lançando ou não custos na atividade associada.

ah eu tive que manter as atividades ManyToMany, pois as estas são previamente existentes e ai pego seu código para inseri-las...

não sei se estou com o raciocínio certo.?

veja ai se pode me dar uma força... obrigado.