Rodrigo_Sasaki 3 de mai. de 2012
O lado que tem a lista tem que ser o lado *ToMany do relacionamento
fabiomedeirosf 3 de mai. de 2012
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
luis.feitoza 3 de mai. de 2012
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 .
luis.feitoza 3 de mai. de 2012
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 3 de mai. de 2012
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. [=
luis.feitoza 3 de mai. de 2012
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 3 de mai. de 2012
@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.
luis.feitoza 3 de mai. de 2012
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.