Obs: utilizo JSF + Hibernate (Jboss Seam).
Pessoal, na minha aplicação tenho a classe Operador que pode receber um ou muitos telefones, e esses telefones são digitados na hora de cadastrar um operador.
Qual a maneira mais correta de fazer isso?
Eu já utilizei m2m em outras áreas, mas eu não digitava nenhum valor e sim escolhia através de checkboxes, e isso é tranquilo.
Alguém com paciencia veja como estou tentando fazer:
Na classe de entidade Operador tenho um atributo que é uma lista de telefones e mapeei m2m operador-telefone:public class Operator {
private Integer operatorId;
private String name;
private List<Telephone> telephones;
}
@ManyToMany
@JoinTable(name = "operator_telephone", joinColumns = @JoinColumn(name = "operator_id"), inverseJoinColumns = @JoinColumn(name = "telephone_id"))
public List<Telephone> getTelephones() {
return telephones;
}
@Table(name = "operator_telephone")
public class OperatorTelephone implements Serializable {
private Integer operatorTelephoneId;
private Operator operator;
private Telephone telephone;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "operator_telephone_id", unique = true, nullable = false)
public Integer getOperatorTelephoneId() {
return this.operatorTelephoneId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "operator_id", nullable = false)
@NotNull
public Operator getOperator() {
return operator;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "telephone_id", nullable = false)
@NotNull
public Telephone getTelephone() {
return this.telephone;
}
//setters
}
Na minha OperadorAction, tenho os seguintes métodos:
1 - getListTelephone(): cria uma lista do tipo Telefone, para que eu possa utilizar na view do JSF;
2 - saveOperator(): no método para salvar Operador, depois de persistir o mesmo eu crio um laço que, a cada iteração da listaTelefones, instancia um objeto OperadorTelefone e o persiste (ou deveria persistir, já que não funcionou). Segue o código:
public String saveOperator() {
if (operator.getOperatorId() == null) {
entityManager.persist(operator);
getListTelephone();
for (int i = 0; i < listTelephone.size(); i++) {
telephoneOperator = new OperatorTelephone();
entityManager.persist(telephone);
telephoneOperator.setTelephone(listTelephone.get(i));
telephoneOperator.setOperator(operator);
entityManager.persist(telephoneOperator);
}
}
return "saveOperator";
}
@Factory("listTelephone")
public void getListTelephone() {
listTelephone = new ArrayList<Telephone>();
for (int i = 0; i < 2; i++) {
telephone = new Telephone();
listTelephone.add(i, telephone);
}
}
<a:repeat value="#{listTelephone}" var="_lt" id="listTelephone">
<ui:define name="label">Telefone</ui:define>
<h:inputText id="telephone" size="20" maxlength="10"
value="#{telephone.number}" label="Telefone">
<a:support event="onblur" reRender="telephoneDecoration"
bypassUpdates="true" ajaxSingle="true" />
</h:inputText>
</a:repeat>
Tenho quase certeza que deve existir uma maneira melhor de se fazer isso, algo "mágico" que o Hibernate faça, mas não consegui achar nada, se alguém puder dar umas dicas agradeço.