[Ajuda]Hibernate associar id com @ManyToOne

3 respostas Resolvido
B

Oi pessoal, estou com problemas para salvar o codigo de uma multa como codigoMulta de outra classe.

Segue as classes

Multa

@Entity
@Table(name = "Multa")
public class Multa extends Entidade implements Serializable {
	private static final long serialVersionUID = 1L;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "codigoUsuario", nullable = false)	
	private Usuario usuario;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "codigoUsuarioOperador", nullable = false)	
	private Usuario operador;

	@Column(name="data")
	private Long data;

	@Column(name="tipo")
	@Enumerated(EnumType.STRING)
	private CategoriaDaMultaEnum multa;

	@Column(name="descricao")
	private String descricao;
	
	@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="multa")
	private List<ImagemMulta> imagem;

	public List<ImagemMulta> getImagem() {
		return imagem;
	}

	public void setImagem(List<ImagemMulta> imagem) {
		this.imagem = imagem;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public Usuario getOperador() {
		return operador;
	}

	public void setOperador(Usuario usuario) {
		this.operador = usuario;
	}

	public Long getData() {
		return data;
	}

	public void setData(Long data) {
		this.data = data;
	}

	public CategoriaDaMultaEnum getMulta() {
		return multa;
	}

	public void setMulta(CategoriaDaMultaEnum multa) {
		this.multa = multa;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}

ImagemMulta

@Entity
@Table(name = "ImagemMulta")
public class ImagemMulta extends Entidade implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@Lob
	@Column(name="imagem")
	private byte[] imagem;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "codigoMulta",  nullable = false)
	private Multa multa;
	
	public Multa getMulta() {
		return multa;
	}

	public void setMulta(Multa multa) {
		this.multa = multa;
	}
	
	public byte[] getImagem() {
		return imagem;
	}

	public void setImagem(byte[] imagem) {
		this.imagem = imagem;
	}
}

Entidade (so para saberem o que é)

@MappedSuperclass
public class Entidade implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "codigo")
	@GeneratedValue(strategy = GenerationType.AUTO)
	protected Long codigo;

	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
}

Bom, é o seguinte,

//Dados da nova multa
Multa novaMulta = new Multa();
novaMulta.setOperador(operador);
novaMulta.setData(System.currentTimeMillis());
novaMulta.setUsuario(usuario);
novaMulta.setMulta(getCategoriaDaMulta());
novaMulta.setDescricao(taDescricao.getText());
novaMulta.setImagem(imagensMulta);

//Salva multa
MultaDao multaDao = new MultaDaoHibernateImpl();
multaDao.save(novaMulta);

eu uso o código assim para salvar uma nova Multa, a variável imagensMulta é uma List<ImagemMulta> que contem todas as imagens que o usuário quer salvar referente a uma multa, o problema é que na classe ImagemMulta ele salva a imagem mas não o codioMulta para fazer a referencia de qual multa essa imagem pertence, a questão é que eu não consigo referenciar o código da classe multa para o codigoMulta da classe ImagemMulta, as imagensMultas são salvas com o cascade all que eu botei na classe Multa mas não sei como fazer o id da multa ir para a imagemMulta.

3 Respostas

A
Solucao aceita

Tente alterar isso

Pra isso:

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "codigoMulta", , referencedColumnName="codigo",  nullable = false)
    private Multa multa;

Pois sua classe Multa não tem uma coluna chamada codigoMulta, logo acredito que falta você dizer qual coluna codigoMulta referencia na tabela Multa.

Espero ter ajudado. :wink:

[EDIT] - Outra dica: Se sua classe Entidade implementa Serializable, todas as filhas dela automaticamente também implementam de forma que você não precisa repetir o implements nem em Multa e nem em ImagemMulta

B

Pois sua classe Multa não tem uma coluna chamada codigoMulta, logo acredito que falta você dizer qual coluna codigoMulta referencia na tabela Multa.

Cara, ainda assim não salva o codigoMulta com o codigo da Multa, acho que o objeto Multa não esta chegando a classe ImagemMulta, pois o (nullable = false) da erro do Hibernate dizendo que a coluna não pode ser nula. Não tenho ideia do que fazer :frowning:

B

Bah, consegui, tava mongando numa parte do código aqui, obrigado!

Criado 28 de junho de 2016
Ultima resposta 28 de jun. de 2016
Respostas 3
Participantes 2