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
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
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.
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!
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
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!
Dá uma especificada no que você precisa fazer com as Collections, posta seus códigos, etc…
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
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?
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.
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
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??
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.
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??
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.
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
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.
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
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.
opah… valeu… acabei de voltar do almoço
estou indo testar… daki a poko eu posto
valeeu
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