Ajuda com Hibernate

19 respostas
renato_ramos

Bom dia gente,

eu fiz as classes de persistencia com o hibernate… ms eu tenho relações de um para muitos…

oq me aconselham a fazer com elas??

ja vi em tutoriais para transformar em um pra um… mas não entendi o porque

valeu!

[]'s

19 Respostas

B

Bom, minha opinião é a seguinte:

Se na sua modelagem a relação entre as tabelas for de 1…N, utilize assim também no Hibernate, mas a relação entre seus beans devem respeitar este relacionamento também.

Abrs.

renato_ramos

valeu biro

mas,desculpa a falta de conhecimento

como eu sei que meus beans estão obedecendo a regra??

outra xD… é melhor trabalhar com collection ou com list? ou qq outra forma de agrupamento?

abraçoss

valeu!

tRuNkSnEt

Um para muitos não pode ser transformado em um para um, isso é ate uma questão de lógica. Seria como se você estivesse projetando um modulo de compra de um supermercado. Uma compra pode ter diversos produtos (um-para-muitos) e do nada você estipula na sua regra que uma compra so poderá existir um produto (um-para-um). Faz sentido fazer essa mudança de relacionamento? Não mesmo.

No hibernate esse relacionamento é muito fácil, de uma olhada nessa parte da documentação que fica muito claro com fazer esse relacionamento. http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e1177

Tente fazer, qualquer duvida poste aqui que te ajudamos

renato_ramos

valeu ^^’

vendo isso acho que minha duvida é outra … porque isso o wizard crio sozinho… e eu entendi mais ou menos como funciona,

minha maior dificuldade está sendo na hora de trabalhar com as collections,

por exemplo: eu qru inserir uma qdte incerta de valores na collection via jsp… ja faz algum tempo que estou tentando fazer isso mas nao to conseguindo… oq eu to fazendo de tutorial nun é brincandeira lol

mas nunca consigo…

sera que estou fazendo os tutoriais corretos??

mt obrigado pelas dicas

abraços!

B

Dá uma especificada no que você precisa fazer com as Collections, posta seus códigos, etc…

renato_ramos

blz

bom eu tenho um formulário onde o usuario vai cadastrar questoes e essas questoes podem ou nao ter alternativas..

se tiver alternativa ... que é a parte que esta me pegando.. tem q ter um meio do usuario inserir a quantidade que ele deseja de alternativas..

simples não?? mas estou me matando..

hibernate
@Entity
@Table(name = "tbl_questao")
@NamedQueries({@NamedQuery(name = "Questao.findAll", query = "SELECT q FROM Questao q")})
public class Questao implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_questao")
    private Integer idQuestao;
    @Basic(optional = false)
    @Column(name = "desc_questao")
    private String descQuestao;
    @Basic(optional = false)
    @Column(name = "alternativa_questao")
    private boolean alternativaQuestao;
    @OneToMany(mappedBy = "idQuestao")
    private Collection<Alternativa> alternativaCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idQuestao")
    private Collection<Resposta> respostaCollection;
    @JoinColumn(name = "id_modelo", referencedColumnName = "id_modelo")
    @ManyToOne
    private ModeloQuestionario idModelo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idQuestao")
    private Collection<ModeloQuestionario> modeloQuestionarioCollection;

    public Questao() {
    }

    public Questao(Integer idQuestao) {
        this.idQuestao = idQuestao;
    }

    public Questao(Integer idQuestao, String descQuestao, boolean alternativaQuestao) {
        this.idQuestao = idQuestao;
        this.descQuestao = descQuestao;
        this.alternativaQuestao = alternativaQuestao;
    }

    public Integer getIdQuestao() {
        return idQuestao;
    }

    public void setIdQuestao(Integer idQuestao) {
        this.idQuestao = idQuestao;
    }

    public String getDescQuestao() {
        return descQuestao;
    }

    public void setDescQuestao(String descQuestao) {
        this.descQuestao = descQuestao;
    }

    public boolean getAlternativaQuestao() {
        return alternativaQuestao;
    }

    public void setAlternativaQuestao(boolean alternativaQuestao) {
        this.alternativaQuestao = alternativaQuestao;
    }

    public Collection<Alternativa> getAlternativaCollection() {
        return alternativaCollection;
    }

    public void setAlternativaCollection(Collection<Alternativa> alternativaCollection) {
        this.alternativaCollection = alternativaCollection;
    }

    public Collection<Resposta> getRespostaCollection() {
        return respostaCollection;
    }

    public void setRespostaCollection(Collection<Resposta> respostaCollection) {
        this.respostaCollection = respostaCollection;
    }

    public ModeloQuestionario getIdModelo() {
        return idModelo;
    }

    public void setIdModelo(ModeloQuestionario idModelo) {
        this.idModelo = idModelo;
    }

    public Collection<ModeloQuestionario> getModeloQuestionarioCollection() {
        return modeloQuestionarioCollection;
    }

    public void setModeloQuestionarioCollection(Collection<ModeloQuestionario> modeloQuestionarioCollection) {
        this.modeloQuestionarioCollection = modeloQuestionarioCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idQuestao != null ? idQuestao.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Questao)) {
            return false;
        }
        Questao other = (Questao) object;
        if ((this.idQuestao == null && other.idQuestao != null) || (this.idQuestao != null && !this.idQuestao.equals(other.idQuestao))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "dominio.Questao[idQuestao=" + idQuestao + "]";
    }

}

meu formulario está todo baguncando pq eu jah tentei diversas coisas.. vo tentar arrumar ele

ah tbm tem a classe dao... td isso eu fiz basando em livro

[code]
@Repository
@Transactional
public class QuestaoDao
{
    @PersistenceContext
    private EntityManager em;
    
    public QuestaoDao()
    {
        
    }
    
    public Questao gravar(Questao questao) throws DataAccessException
    {
        return em.merge(questao);
    }
    
    public void excluir(Questao questao) throws  DataAccessException
    {
        em.remove(questao);
    }
    
    public Questao carregar(Integer id) throws DataAccessException
    {
        return em.find(Questao.class, id);
    }
    
    public List obterTodos() throws  DataAccessException
    {
        return em.createQuery("SELECT u FROM Questao u").getResultList();
    }
    

    public List ObterporModelo(String idModelo) throws DataAccessException
    {
        Query qry = em.createQuery("SELECT u FROM Questao u WHERE u.idModelo = :idModelo");
        qry.setParameter("idModelo", "%"+idModelo+"%");
        return qry.getResultList();
    }

}

mt obrigado pela atencao

renato_ramos

descula aidna falto uma outra classe… que e a da propria pagina… eu fiz um metodo para inserir inputs…

mas eu não consigo fazer o binding… nen sei c esse é o jeito certo de se fazer isso

public String btnInserir_action() {
        // TODO: Processe a ação. O valor de retorno é um nome de caso
        // de navegação em que nulo retornará à mesma página.
        
        label = new Label();
        label.setText("Alternativa ");
        inputText = new HtmlInputText();
        gridAlternativa.getChildren().add(label);
        gridAlternativa.getChildren().add(inputText);
        return null;
    }

tem alguma jeito de ligar os inputs a alguma lista?

B

Você criou um binding para o value da gridAlternativa?
Deveria haver um atributo do tipo Collections em um managed bean(no caso de JSF), então vc ligaria este atributo à propriedade value da gridAlternativa. Então cada vez que você adicionar uma alternativa, você pega os valores dos inputs, popula um objeto Alternativa e adiciona nesta Collection.

renato_ramos

Você criou um binding para o value da gridAlternativa?
Deveria haver um atributo do tipo Collections em um managed bean(no caso de JSF), então vc ligaria este atributo à propriedade value da gridAlternativa. Então cada vez que você adicionar uma alternativa, você pega os valores dos inputs, popula um objeto Alternativa e adiciona nesta Collection.

intaum dexa eu v c entendi

mt coisa pra minha cabeça huauhu

eu criei o binding para o grid…

eu crio um atributo do tipo colections e coloco ele no managed bean

populo a objeto alternativa com os valores dos inputs…

esse atributo eu ligo com o value do grid?

irei tentar isso… daki a poko posto a resposta

mt obrigado messmo

renato_ramos

me expressei errado… não criei um binding pro value… pq o grid não tem atributo value ‘-’

foi feito o bind do compenente todo

e agora?

o que fazer??

B

Que componente você está utilizando?
dataTable?? panelGrid?

Você precisa utilizar o dataTable, este tem a propriedade value para você criar o binding para a Collection.

renato_ramos

tava usando o grouppanel… acabei de ver no livro

“esse componente nao tem valor” xD

vou tentar com datatable

surgiu uma divida… enqto estou procurando a solução para isto…

se eu fazer o set na collection alternativa no objeto Questao…

qndo eu fazer o metodo para gravar a questao… automaticamente o hibernate vai salvar as alternativas na tabela alternativa??

B

Olha, não sou tão bom em hibernate, mas creio que você precise adicionar a annotation Cascade para seu atributo Collection(de alternativas, no caso). Se você der uma pesquisada pelo fórum, vai achar posts referentes a isto.

http://guj.com.br/posts/list/121653.java

renato_ramos

blz… valeu… vo dah uma pesquisada

eu coloquei o datable na pagina e coloquei o value pra collection de alternativa que estah no objeto questao…

mas… o datatable vem por default com outputs… eu mudei e coloquei um input…

esse input vai direto pra colection… ou tem q fazer algum bind??

dá pra inserir linhas por meio de algum metodo?

estou tentando isso agora ^^’

mt obrigado

abraços

B

Não, o input não vai direto para a collection. Se você colocar inputs, todas as alternativas já adicionadas ficarão editáveis. Então vai ficar mais complexo para controlar os valores, pois toda vez q incluir uma alternativa na collection, você terá que ler toda a collection e substituí-la dentro do objeto Questao(meio complicado de explicar).

Eu recomendaria um pequeno formulário antes da dataTable e, no botão Incluir deste formulário, você armazenaria os valores dos inputs dentro de um objeto Alternativa e adicionaria na collection de alternativas.

renato_ramos

td é muito complexo lol

biro… por favor… tem como mostrar um codigo exemplo pra isso … por favor??

tipo eu sei oq fazer… mas nao sei como fazer… entende??

valeeu

B

Bom… Neste exemplo, eu tenho meu managed bean

package exemplo.view.mbean;

import exemplo.model.bean.DepartmentsLocalDTO;//AlternativaBean, por exemplo

import java.util.List;


public class MyManagedBean {

    private Long departmentId;
    private String departmentName;
    private List<DepartmentsLocalDTO> departments;

    public MyManagedBean() {
    }

    public void setDepartments(List<DepartmentsLocalDTO> departments) {
        this.departments = departments;
    }

    public List<DepartmentsLocalDTO> getDepartments() {
        return departments;
    }

    public void setDepartmentId(Long departmentId) {
        this.departmentId = departmentId;
    }

    public Long getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public String adicionarDepartamento() {
        DepartmentsLocalDTO bean = new DepartmentsLocalDTO();
        bean.setDepartmentId(getDepartmentId());
        bean.setDepartmentName(getDepartmentName());
        this.departments.add(bean);
        return null;
    }
}

Bom… primeiro, seguindo o exemplo, você teria um formulário com os inputs código e nome e o botão incluir. Você criaria um binding no managed bean para o código e um para o nome, como mostra no código acima. A ação do botão incluir seria o método adicionarDepartamento(). O value da sua dataTable seria o atributo departments do managed bean acima.

Aí, na sua página, você tem a dataTable:

<h:dataTable value="#{myMBean.departments}" var="depto">
            <h:column>
              <f:facet name="header">
                <h:outputText value="Código"/>
              </f:facet>
              <h:outputText value="#{depto.departmentId}"/>
            </h:column>
            <h:column>
              <f:facet name="header">
                <h:outputText value="Nome"/>
              </f:facet>
              <h:outputText value="#{depto.departmentName}"/>
            </h:column>
          </h:dataTable>

Espero que isto ajude.

renato_ramos

opah… valeu… acabei de voltar do almoço

estou indo testar… daki a poko eu posto

valeeu

renato_ramos

tarde biro…

eu estou me complicando um pouco na onde eu coloco o metodo pra incluir

vou mostrar minhas classes

pra v c ajuda

primeiro tem as duas classes de persistencia questao e alternativa

Questao

@Entity
@Table(name = "tbl_questao")
@NamedQueries({@NamedQuery(name = "Questao.findAll", query = "SELECT q FROM Questao q")})
public class Questao implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_questao")
    private Integer idQuestao;
    @Basic(optional = false)
    @Column(name = "desc_questao")
    private String descQuestao;
    @Basic(optional = false)
    @Column(name = "alternativa_questao")
    private boolean alternativaQuestao;
    @OneToMany(mappedBy = "idQuestao")
    private Collection<Alternativa> alternativaCollection;
    @OneToMany(cascade = CascadeType.MERGE, mappedBy = "idQuestao")
    private Collection<Resposta> respostaCollection;
    @JoinColumn(name = "id_modelo", referencedColumnName = "id_modelo")
    @ManyToOne
    private ModeloQuestionario idModelo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idQuestao")
    private Collection<ModeloQuestionario> modeloQuestionarioCollection;

    public Questao() {
    }

    public Questao(Integer idQuestao) {
        this.idQuestao = idQuestao;
    }

    public Questao(Integer idQuestao, String descQuestao, boolean alternativaQuestao) {
        this.idQuestao = idQuestao;
        this.descQuestao = descQuestao;
        this.alternativaQuestao = alternativaQuestao;
    }

    public Integer getIdQuestao() {
        return idQuestao;
    }

    public void setIdQuestao(Integer idQuestao) {
        this.idQuestao = idQuestao;
    }

    public String getDescQuestao() {
        return descQuestao;
    }

    public void setDescQuestao(String descQuestao) {
        this.descQuestao = descQuestao;
    }

    public boolean getAlternativaQuestao() {
        return alternativaQuestao;
    }

    public void setAlternativaQuestao(boolean alternativaQuestao) {
        this.alternativaQuestao = alternativaQuestao;
    }

    public Collection<Alternativa> getAlternativaCollection() {
        return alternativaCollection;
    }

    public void setAlternativaCollection(Collection<Alternativa> alternativaCollection) {
        this.alternativaCollection = alternativaCollection;
    }

    public Collection<Resposta> getRespostaCollection() {
        return respostaCollection;
    }

    public void setRespostaCollection(Collection<Resposta> respostaCollection) {
        this.respostaCollection = respostaCollection;
    }

    public ModeloQuestionario getIdModelo() {
        return idModelo;
    }

    public void setIdModelo(ModeloQuestionario idModelo) {
        this.idModelo = idModelo;
    }

    public Collection<ModeloQuestionario> getModeloQuestionarioCollection() {
        return modeloQuestionarioCollection;
    }

    public void setModeloQuestionarioCollection(Collection<ModeloQuestionario> modeloQuestionarioCollection) {
        this.modeloQuestionarioCollection = modeloQuestionarioCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idQuestao != null ? idQuestao.hashCode() : 0);
        return hash;
    }

depois a persistencia da Alternativa

@Entity
@Table(name = "tbl_alternativa")
@NamedQueries({@NamedQuery(name = "Alternativa.findAll", query = "SELECT a FROM Alternativa a")})
public class Alternativa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "desc_alternativa")
    private String descAlternativa;
    @Basic(optional = false)
    @Column(name = "valor_alternativa")
    private String valorAlternativa;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_alternativa")
    private Integer idAlternativa;
    @JoinColumn(name = "id_questao", referencedColumnName = "id_questao")
    @ManyToOne
    private Questao idQuestao;

    public Alternativa() {
    }

    public Alternativa(Integer idAlternativa) {
        this.idAlternativa = idAlternativa;
    }

    public Alternativa(Integer idAlternativa, String descAlternativa, String valorAlternativa) {
        this.idAlternativa = idAlternativa;
        this.descAlternativa = descAlternativa;
        this.valorAlternativa = valorAlternativa;
    }

    public String getDescAlternativa() {
        return descAlternativa;
    }

    public void setDescAlternativa(String descAlternativa) {
        this.descAlternativa = descAlternativa;
    }

    public String getValorAlternativa() {
        return valorAlternativa;
    }

    public void setValorAlternativa(String valorAlternativa) {
        this.valorAlternativa = valorAlternativa;
    }

    public Integer getIdAlternativa() {
        return idAlternativa;
    }

    public void setIdAlternativa(Integer idAlternativa) {
        this.idAlternativa = idAlternativa;
    }

    public Questao getIdQuestao() {
        return idQuestao;
    }

    public void setIdQuestao(Questao idQuestao) {
        this.idQuestao = idQuestao;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idAlternativa != null ? idAlternativa.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Alternativa)) {
            return false;
        }
        Alternativa other = (Alternativa) object;
        if ((this.idAlternativa == null && other.idAlternativa != null) || (this.idAlternativa != null && !this.idAlternativa.equals(other.idAlternativa))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "dominio.Alternativa[idAlternativa=" + idAlternativa + "]";
    }

}

ai vem as duas classes DAO

@Repository
@Transactional
public class AlternativaDao
{
    @PersistenceContext
    private EntityManager em;
    
    public AlternativaDao()
    {
        
    }
    
    public Alternativa gravar(Alternativa alternativa) throws DataAccessException
    {
        return em.merge(alternativa);
    }
    
    public void excluir(Alternativa alternativa) throws  DataAccessException
    {
        em.remove(alternativa);
    }
    
    public Alternativa carregar(Integer id) throws DataAccessException
    {
        return em.find(Alternativa.class, id);
    }
    
    public List obterTodosPorQuestao(String idQuestao) throws  DataAccessException
    {
        Query qry = em.createQuery("SELECT u FROM Alternativa u WHERE u.idQuestao = :idQuestao");
        qry.setParameter("idQuestao", idQuestao);
        return qry.getResultList();
    }



}
@Repository
@Transactional
public class AlternativaDao
{
    @PersistenceContext
    private EntityManager em;
    
    public AlternativaDao()
    {
        
    }
    
    public Alternativa gravar(Alternativa alternativa) throws DataAccessException
    {
        return em.merge(alternativa);
    }
    
    public void excluir(Alternativa alternativa) throws  DataAccessException
    {
        em.remove(alternativa);
    }
    
    public Alternativa carregar(Integer id) throws DataAccessException
    {
        return em.find(Alternativa.class, id);
    }
    
    public List obterTodosPorQuestao(String idQuestao) throws  DataAccessException
    {
        Query qry = em.createQuery("SELECT u FROM Alternativa u WHERE u.idQuestao = :idQuestao");
        qry.setParameter("idQuestao", idQuestao);
        return qry.getResultList();
    }

}

aih seguindo o livro ele fez classes facade

eu acompanhei… mesmo não entendendo mt

public class AlternativaFacade
{
    private AlternativaDao alternativaDao;

    public AlternativaFacade()
    {

    }

    public Alternativa gravar(Alternativa  alternativa)
    {
        return getAlternativaDao().gravar(alternativa);

    }

    public void excluir(Alternativa  alternativa)
    {
        getAlternativaDao().excluir(alternativa);
    }

    public Alternativa carregar(Integer id)
    {
        return getAlternativaDao().carregar(id);
    }

    public List obterTodosPorQuestao(String idQuestao)
    {
        return getAlternativaDao().obterTodosPorQuestao(idQuestao);
    }

    /**
     * @return the alternativaDao
     */
    public AlternativaDao getAlternativaDao() {
        return alternativaDao;
    }

    /**
     * @param alternativaDao the alternativaDao to set
     */
    public void setAlternativaDao(AlternativaDao alternativaDao) {
        this.alternativaDao = alternativaDao;
   }

}
public class QuestaoFacade
{
    private QuestaoDao questaoDao;


    public QuestaoFacade()
    {

    }

    public Questao gravar(Questao questao)
    {
        return getQuestaoDao().gravar(questao);

    }

    public void excluir(Questao questao)
    {
        getQuestaoDao().excluir(questao);
    }

    public Questao carregar(Integer id)
    {
        return getQuestaoDao().carregar(id);
    }

    public List obterTodos()
    {
        return getQuestaoDao().obterTodos();
    }

    public List obterPorModelo(String idModelo)
    {
        return getQuestaoDao().ObterporModelo(idModelo);
    }

    public  QuestaoDao getQuestaoDao()
    {
        return questaoDao;
    }

    public void setQuestaoDao( QuestaoDao  questaoDao)
    {
        this.questaoDao = questaoDao;
    }

}

isso eu fiz pras outras classes tambem… ms oq tah em foco sao essas duas.

eu estou usando o visual web pack

entao qndo eu crio uma pagina a ide jah gera um managedbean da pagina

ai agora estou confuso

o livro em qstao eh Java na Web do Yuri …

valeu… desculpa pelo post enorme…

eh q eu jah estou ficando desesperado

Criado 26 de outubro de 2009
Ultima resposta 26 de out. de 2009
Respostas 19
Participantes 3