Dúvida Hibernate [RESOLVIDO]

1 resposta
tati.mat.moreira

Olá pessoal,

estou com um problema usando Hibernate. Estou anotando as classes e mandando o Hibernate gerar as tabelas. Ele cria as duas tabelas, mas na hora de inserir os dados não está fazendo o que quero.
@Entity
@Table(name="USUARIOS")
public class Usuario implements java.io.Serializable {

	private static final long serialVersionUID = -5704331948119910453L;

	@Id  
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="USUARIO_ID")
	private Integer id; 
	
	@Column(name="NAME", nullable=false)
	private String name; 
	
	@Column(name="LOGIN", nullable=false)
	private String login; 
	
	@Column(name="PASSWORD", nullable=false)
	private String password;

	@OneToMany(mappedBy="usuario", fetch=FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<Produto> produtos;
@Entity
@Table(name="PRODUTOS")
public class Produto implements java.io.Serializable {

	private static final long serialVersionUID = 2343684446954574074L;

	@Id  
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="PRODUTO_ID")
	private Integer id; 
	
	@Column(name="NAME", nullable=false)
	private String name; 
	
	@Column(name="PRICE", nullable=false)
	private double price; 
	
	@Column(name="STOCK", nullable=false)
	private int stock; 
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="ID_PROD")
	private Usuario usuario;
CREATE TABLE  `devmedia`.`USUARIOS` (
  `USUARIO_ID` int(11) NOT NULL auto_increment,
  `LOGIN` varchar(255) NOT NULL,
  `NAME` varchar(255) NOT NULL,
  `PASSWORD` varchar(255) NOT NULL,
  PRIMARY KEY  (`USUARIO_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
CREATE TABLE  `devmedia`.`PRODUTOS` (
  `PRODUTO_ID` int(11) NOT NULL auto_increment,
  `NAME` varchar(255) NOT NULL,
  `PRICE` double NOT NULL,
  `STOCK` int(11) NOT NULL,
  `ID_PROD` int(11) default NULL,
  PRIMARY KEY  (`PRODUTO_ID`),
  KEY `FKF2D2009A721E3EDD` (`ID_PROD`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
A classe para fazer o teste:
public class TestDAO {
	
	public static void main(String[] args) {
		UsuarioDAO dao = new UsuarioDAO(); 
		
		Usuario usuario = new Usuario();
				
		usuario.setName("João da Silva");
		usuario.setLogin("jao");
		usuario.setPassword("123");
		
		Produto p1 = new Produto();
		p1.setName("Produto um");
		p1.setPrice(15d);
		p1.setStock(100);

		Produto p2 = new Produto();
		p2.setName("Produto dois");
		p2.setPrice(25d);
		p2.setStock(200);

		Produto p3 = new Produto();
		p3.setName("Produto três");
		p3.setPrice(35d);
		p3.setStock(500);
		
		List<Produto> produtos = new ArrayList<Produto>();
		produtos.add(p1);
		produtos.add(p2);
		produtos.add(p3);
		
		usuario.setProdutos(produtos);
		
		dao.addUsuario(usuario);
O usuário e os produtos são inseridos no banco, mas o campo ID_PROD da tabela PRODUTOS recebem valor NULL. Quando eu tento buscar o usuario eu consigo com sucesso, mas se eu tento buscar os produtos relacionados a ele com o código:
UsuarioDAO dao = new UsuarioDAO();
	Usuario usuario = dao.getUsuario(1);
	
	System.out.println(">>> "+usuario.getProdutos());
recebo o erro:
Hibernate: select usuario0_.USUARIO_ID as USUARIO1_3_0_, usuario0_.LOGIN as LOGIN3_0_, usuario0_.NAME as NAME3_0_, usuario0_.PASSWORD as PASSWORD3_0_ from USUARIOS usuario0_ where usuario0_.USUARIO_ID=? ERROR - failed to lazily initialize a collection of role: devmedia.entity.Usuario.produtos, no session or session was closed org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: devmedia.entity.Usuario.produtos, no session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:506) at java.lang.String.valueOf(String.java:2827) at java.lang.StringBuilder.append(StringBuilder.java:115) at devmedia.test.TestDAO.main(TestDAO.java:48) Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: devmedia.entity.Usuario.produtos, no session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:506) at java.lang.String.valueOf(String.java:2827) at java.lang.StringBuilder.append(StringBuilder.java:115) at devmedia.test.TestDAO.main(TestDAO.java:48)
O quê está errado? :cry: Bjos...

1 Resposta

tati.mat.moreira

Consegui resolver,

a modelagem estava certa, o teste estava incompleto. Faltava relacionar os produtos ao usuário. :slight_smile:

p1.setUsuario(usuario); p2.setUsuario(usuario); p3.setUsuario(usuario);

Criado 9 de janeiro de 2009
Ultima resposta 10 de jan. de 2009
Respostas 1
Participantes 1