Erro de mapeamento de @ManyToOne

8 respostas
L

Bom dia a todos, estou tendo um problema com o mapeamento, estou tendo algumas dúvidas, eu tenho duas classes modelos (Sistema/PerfilUsuario) onde um sistema podera ter varios usuários.

Então segue as classes.

Classe Sistema:

@Entity
@Table(name="sistema")
public class Sistema implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	private Long idSistema;
	
	private String nomeSistema;
	private String descricao;
	
	@ManyToOne(fetch=FetchType.LAZY, targetEntity = br.com.sisapropriacao.modelo.PerfilUsuario.class)
	@JoinTable(name="usuarios_sistemas",
    joinColumns= @JoinColumn( name = "sistema_idSistema"),
	inverseJoinColumns= @JoinColumn(name = "usuario_idUsuario"))	
	private List<PerfilUsuario> usuarios;

getters e setters...

Classe PerfilUsuario:

@Entity
@SessionScoped
@Table(name="usuario")
public class PerfilUsuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@GeneratedValue
	private Long idUsuario;
	
	private String login;

	private String senha;
		
	private String nome;
	
	private String endereco;
	
	private String telefone;

getters e setters...

Quando estou tentando commitar ele da essa exceção aqui....

could not get a field value by reflection getter of br.com.sisapropriacao.modelo.PerfilUsuario.idUsuario

Ou seja ele não está conseguindo pegar o valor de referência da tabela PerfilUsuario que e o idUsuario.

Desde já, obrigado!

8 Respostas

Rodrigo_Sasaki

O lado que tem a lista tem que ser o lado *ToMany do relacionamento

fabiomedeirosf

Fiz um post no meu blog sobre este mapeamento, dá uma olhada, poderá te ajudar:
http://serjava.blogspot.com.br/2012/03/persistencia-jpa-onetomany-e-manytoone.html

Se o problema persistir poste ai!

[]s

L

Muito bom fabio seu post já até coloquei nos favoritos, cara então eu fiz uma confusão enorme você teria o @ManyToMany porque
meu relacionamento ele será na realidade @ManyToMany e não @ManyToOne.

L
fabiomedeirosf:
Fiz um post no meu blog sobre este mapeamento, dá uma olhada, poderá te ajudar: [url]http://serjava.blogspot.com.br/2012/03/persistencia-jpa-onetomany-e-manytoone.html[/url]

Se o problema persistir poste ai!

[]s

Então fabiomedeirosf como eu falei na verdadade e @ManyToMany peguei algumas dicas do seu post e ficou assim minhas classes modelo só que agora está dando esse erro aqui oh...

@ManagedBean
@ViewScoped
public class SistemaBean implements Serializable{


	private static final long serialVersionUID = 1L;

	private Sistema sistema  = new Sistema();
	private List<Sistema> sistemas;
	
	private DualListModel<PerfilUsuario> usuarioModel;
	
	private PerfilUsuario perfilUsuario = new PerfilUsuario();
	
	private List<PerfilUsuario> usuariosSelecionados = new ArrayList<PerfilUsuario>();
	private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
	
	private List<PerfilUsuario> perfilUsuarios;
	
	public String gravar(){
		
		DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);

		usuarios = usuarioModel.getSource();
		usuariosSelecionados = usuarioModel.getTarget();
		
		if(sistema.getIdSistema() == null){
			sistema.setPerfilUsuario(usuariosSelecionados);
			dao.adiciona(sistema);
		}else{
			dao.atualiza(sistema);
		}
@Entity
@SessionScoped
public class PerfilUsuario implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@GeneratedValue
	@Column(name = "id_usuario")
	private Long idUsuario;
	
	private String login;

	private String senha;
		
	private String nome;
	
	private String endereco;
	
	private String telefone;
	
	private String rg;

Erro:

[color=red]Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [br.com.sisapropriacao.modelo.Sistema]
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:600)
	... 37 more
Caused by: java.sql.SQLException: Field 'id_sistema' doesn't have a default value
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2398)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2316)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2301)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 52 more[/color]
Hebert_Coelho

Posta aí como ficou suas classes após as alterações que você fez.

Cara, aqui eu mostro como funciona esse relacionamento: @OneToMany e @ManyToOne Unidirecional e Bidirecional.

Entenda também a diferença entre bidirecional e uni direcional. [=

L

jakefrog:
Posta aí como ficou suas classes após as alterações que você fez.

Cara, aqui eu mostro como funciona esse relacionamento: @OneToMany e @ManyToOne Unidirecional e Bidirecional.

Entenda também a diferença entre bidirecional e uni direcional. [=

As classes alteradas estão acima, e estão gerando erros.

Hebert_Coelho

@ManyToOne(fetch=FetchType.LAZY, targetEntity = br.com.sisapropriacao.modelo.PerfilUsuario.class) @JoinTable(name="usuarios_sistemas", joinColumns= @JoinColumn( name = "sistema_idSistema"), inverseJoinColumns= @JoinColumn(name = "usuario_idUsuario")) private List<PerfilUsuario> usuarios;
Pq esse cara você colocou ManyToOne? Leia o link que eu te passei. Você precisa entender como funciona esse relacionamento e a diferença também entre uni e direcional.

A ponta que contém a lista deve ser mapeada por OneToMany.

L

jakefrog:
@ManyToOne(fetch=FetchType.LAZY, targetEntity = br.com.sisapropriacao.modelo.PerfilUsuario.class) @JoinTable(name="usuarios_sistemas", joinColumns= @JoinColumn( name = "sistema_idSistema"), inverseJoinColumns= @JoinColumn(name = "usuario_idUsuario")) private List<PerfilUsuario> usuarios;
Pq esse cara você colocou ManyToOne? Leia o link que eu te passei. Você precisa entender como funciona esse relacionamento e a diferença também entre uni e direcional.

A ponta que contém a lista deve ser mapeada por OneToMany.

A classe que tem o relacionamento que é o sistema ficou assim agora.

@Entity
public class Sistema implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	@Column(name = "id_sistema")
	private Long idSistema;
	
	private String nomeSistema;
	private String descricao;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name = "usuarios_vinculados_sistemas",
	joinColumns={@JoinColumn(name="id_sistema")}, 
	inverseJoinColumns={@JoinColumn(name="id_usuario")})
	private List<PerfilUsuario> perfilUsuario;
	
	public Long getIdSistema() {
		return idSistema;
	}

	public void setIdSistema(Long idSistema) {
		this.idSistema = idSistema;
	}

Só que eu continuo enfrentando dificuldades no método de gravar.

usuarios = usuarioModel.getSource();
		usuariosSelecionados = usuarioModel.getTarget();
		
		if(sistema.getIdSistema() == null){
			
*************   sistema.setPerfilUsuario(getPerfilUsuarios());  ************************
			dao.adiciona(sistema);
		}else{
			dao.atualiza(sistema);
		}

Desta forma que está citada ele grava todos os usuários cadastrados no sistema, mais eu queria que fosse desta forma.

usuarios = usuarioModel.getSource();
		usuariosSelecionados = usuarioModel.getTarget();
		
	
		if(sistema.getIdSistema() == null){
			sistema.setPerfilUsuario(usuariosSelecionados);
			dao.adiciona(sistema);
		}else{
			dao.atualiza(sistema);
		}

Ou seja só quero pegar o ID do usuário selecionado e não todos.

Criado 3 de maio de 2012
Ultima resposta 3 de mai. de 2012
Respostas 8
Participantes 4