Seguinte, estou com o problema a seguir:
Tenho as entidades marcaVeiculo e modeloVeiculo, exemplo: fiat e uno, respectivamente…
E então, eu tenho as seguintes anotações hibernate de relacionamento:
MarcaVeiculo
[code]
@Entity
@Table(name=“marcaveiculo”)
public class MarcaVeiculo {
@Id
@GeneratedValue
@NotNull
private Long codigo;
@OneToMany(mappedBy = "marcaveiculo",fetch = FetchType.EAGER,cascade=CascadeType.REMOVE)
private List<ModeloVeiculo> modeloveiculo;
@Column(length = 25, nullable = false)
private String nome;[/code]
ModeloVeiculo
[code]
@Entity
@Table(name=“modeloveiculo”)
public class ModeloVeiculo {
@Id
@GeneratedValue
@NotNull
private long codigo;
@ManyToOne
@JoinColumn(name = "marcaveiculo")
private MarcaVeiculo marcaveiculo;
@Column(length = 25, nullable = false)
private String nome;[/code]
Quando eu listo toas as MARCAS:
marca sem modelo = aparece 1x na lista.
marca com 1 modelo = aparece 1x na lista.
marca com 2 modelos,aparece 2x na lista.
marca com 3 modelos, aparece 3x na lista.
Não entendo porque isso aconteceu, onde eu fiz a anotação errada… alguém pode me ajudar?
Abraços!
Pode mostrar o seu select?
claro:
MarcaVeiculoDao
@SuppressWarnings("unchecked")
public List<MarcaVeiculo> listaTudo() {
return session.createCriteria(MarcaVeiculo.class)
.addOrder(Order.asc("nome")).list();
}
controller
@Get
@Path("/marcas")
public List<MarcaVeiculo> lista() {
return dao.listaTudo();
}
coloque assim:
return session.createCriteria(MarcaVeiculo.class)
.addOrder(Order.asc("nome")).setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY).list();
valeu amigo, isso resolveu… mas eu não entendi o que aconteceu… porque só aparece cadastrado no banco 1x :s
Acredito que esteja acontecendo isso pois falta referenciar os campos.
Por exemplo funcionario e favoritos. (favoritos seria a sua entidade modelo)
Favoritos tem o cdn_funcionario.
E na entidade marca você adiciona a anotação referenciando o campo chave.
@Fetch(FetchMode.SELECT)
@Cache(usage = CacheConcurrencyStrategy.NONE)
@OneToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER, targetEntity = Favoritos.class)
@JoinColumn(name = "cdn_funcionario", referencedColumnName = "cdn_funcionario", insertable = false, updatable = false)
@OrderBy(value = "cdn_programa")
private Set<Favoritos> favoritos;
Ele vai trazer todas as marcas com os modelos certinho. Vlw.
Vou te explicar:
Quando você faz um select buscando os registros filhos o banco retorna uma linha por registro, então fica assim:
PAI_ID FILHO_ID
1--------------------------1
2--------------------------2
2--------------------------3
Ou seja, para ele conseguir trazer todos os filhos, ele precisa repetir o pai.
Quando colocamos aquilo, estamos dizendo ao banco que queremos apenas 1 linha para cada pai, e que ele despreze os filhos.
estranho isso, pois eu procurava pela marca… e a marca é o registro pai oO
eu acho, pelo menos