Galera, sei que tem como gravar uma coleção de dados dependente de outra tabela, porem não estou conseguindo, ele grava apenas a tabela principal
Tenho uma classe Empresa com um atributo do tipo Collection:
public class Empresa extends AbstractEntity {
// campos
...
@OneToMany(mappedBy = "idEmpresa")
private Collection<Telefone> telefones;
Classe Telefone esta mapeada desta forma:
@JoinColumn(name = "id_empresa", referencedColumnName = "id")
@ManyToOne
private Empresa idEmpresa;
No Controller nem no DAO acredito que não deva mudar nada, pois a intenção é alimentar a lista e no save ele se virar para gravar
Alimentei a lista desta forma:
<div class="tab-pane fade" id="tab_telefone">
<div class="control-group">
<div class="controls">
<a href="#" class="btn btn-success" onclick="adicionar();"> <fmt:message key="app.adicionar"/> </a>
<hr />
</div>
<c:forEach items="${entity.telefones}" var="telefone" varStatus="status">
<div class="telefone">
<label for="telefone"> <fmt:message key="telefone.tipo"/> / <fmt:message key="telefone.telefone"/></label>
<select name="entity.telefones[${status.index}].tipo" id="tipo" style="margin-right: 10px;">
<c:forEach items="${telefoneTypes}" var="tipo">
<c:set var="sel" value="${telefone.tipo eq tipo ? 'selected':''}"></c:set>
<option value="${telefone.tipo}"${sel}>${tipo.label}</option>
</c:forEach>
</select>
<input type="text" placeholder="" id="telefone" data-mask="(99) 9999-9999" name="entity.telefones[${status.index}].telefone" value="${telefone.telefone}" class="input-large">
<input type="hidden" name="entity.telefones[${status.index}].id" value="${telefone.id}" />
<a id="remover" class="btn btn-link" onclick="remover(this);"> <fmt:message key="app.excluir"/> </a>
</div>
</c:forEach>
</div>
</div>
jQuery para acrescentar os fields dinamico e trocar indices:
<script>
var model =
'<div class="telefone">' +
'<label for="telefone"> <fmt:message key="telefone.tipo"/> / <fmt:message key="telefone.telefone"/></label>' +
'<select name = "entity.telefones[0].tipo" id="tipo" style = "margin-right: 10px;" >' +
'<c:forEach items="${telefoneTypes}" var="tipo">' +
'<c:set var="sel" value="${telefone.tipo eq tipo ? 'selected':''}"></c:set>' +
'<option value = "${telefone.tipo}"${sel} >${tipo.label} </option>' +
'</c:forEach>' +
'</select>' +
'<input type="text" id="telefone" data-mask="(99) 9999-9999" name="entity.telefones[0].telefone" class="input-large">' +
'<a id="remover" class="btn btn-link" onclick="remover(this);"> <fmt:message key="app.excluir"/> </a>' +
'</div>';
function remover(element) {
$(element).parent().remove();
reorderIndexes();
}
;
function adicionar() {
$('#tab_telefone').append(model);
reorderIndexes();
}
;
function reorderIndexes() {
var regex = /\[[0-9]\]/g;
$('.telefone').each(function(index) {
var $campos = $(this).find('input'),
$input,
name;
$campos.each(function() {
$input = $(this),
name = $input.attr('name');
$input.attr('name', name.replace(regex, '[' + index + ']'));
});
});
}
;
</script>
Quando debuggo o Controller antes de dar um save() a lista esta null, não sei se fiz certo a forma de alimentar elas! Alguém poderia me ajudar ?