Olá a todos os colegas GUJ.
Estou com um problema tem alguns dias. Implementei um formulário que contem um <h:selectOneMenu> onde o <f:selectItems> é populado por uma lista do banco de dados.
Tenho vários usuários (Classe User) que podem possuir vários cargos (Classe Cargo).
Problema: não estou conseguindo inserir no banco a seleção do usuário. Não sei dizer se o erro está no preenchimento do <f:selectItems> ou se está na regra de persistência dos dados com o Hibernate. Segue o exemplo do código:
Classe User
@Entity
@Table(name="user")
public class User implements Serializable, UserDetails {
private static final long serialVersionUID = -8451679170281063697L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private Long id;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_cargo",
joinColumns = @JoinColumn(name="user_id" , referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="cargos_id" , referencedColumnName="id"))
private List<Cargo> cargos;
...
Classe Cargo
@Entity
@Table(name="cargo")
public class Cargo implements Serializable {
private static final long serialVersionUID = 1886820991361556707L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private Long id;
@NotNull
private String nome;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_cargo",
joinColumns = @JoinColumn(name="cargos_id" , referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="user_id" , referencedColumnName="id"))
private List<User> users;
...
Classe UserController
@ManagedBean(name="userController")
@ViewScoped
public class UserController implements Serializable{
private User user = new User();
private List<User> listaUsers = new ArrayList<User>();
private UserDao userDao = (UserDao) BeanFactory.getBean("userDao", UserDao.class);
public void gravar(){
userDao.gravar(getUser());
atualizarTela();
}
...
Classe UserDao
public class UserDao{
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.session = sessionFactory.openSession();
}
public void gravar(User user) {
try {
if (!session.isOpen()) {
session = sessionFactory.openSession();
}
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (HibernateException e) {
System.out.println("Erro: " + e.getMessage());
transaction.rollback();
} finally {
try {
if (session.isOpen()) {
session.close();
}
} catch (Throwable e) {
System.out.println("Erro ao finalizar inserção: " + e.getMessage());
}
}
}
...
Classe CargoController
@ManagedBean(name="cargoController")
@ViewScoped
public class CargoController implements Serializable{
private Cargo cargo = new Cargo();
private List<Cargo> listaCargos = new ArrayList<Cargo>();
private CargoDao cargoDao = (CargoDao) BeanFactory.getBean("cargoDao", CargoDao.class);
public void gravar(){
cargoDao.gravar(getCargo());
atualizarTela();
}
public List<Cargo> getListaCargos() {
listaCargos = cargoDao.buscarTodos();
return listaCargos;
}
CargoDao
public class CargoDao {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.session = sessionFactory.openSession();
}
public List<Cargo> buscarTodos(){
if (!session.isOpen()) {
session = sessionFactory.openSession();
}
transaction = session.beginTransaction();
List lista = session.createQuery("from Cargo").list();
if (session.isOpen()) {
session.close();
}
return lista;
}
cadastro.xhtml
<h:selectOneMenu id="cargos">
<f:selectItem itemValue="Selecione..." itemLabel="Selecione..." />
<f:selectItems value="#{cargoController.listaCargos}" itemValue="#{cargos.id}" />
</h:selectOneMenu>
Muito obrigado pela ajuda.
Abraços!