O documento discute estratégias de persistência de objetos em Java, com foco no framework Hibernate. Hibernate mapeia objetos Java para tabelas de banco de dados relacional, permitindo que os desenvolvedores trabalhem com objetos ao invés de SQL. O documento explica como configurar e usar Hibernate, incluindo a criação de entidades, consultas, transações e associações entre objetos.
35. Criando uma entidade @Entity @Table (name = "MESSAGES" ) public class Message { @Id @GeneratedValue @Column (name = "MESSAGE_ID" ) private Long id ; @Column (name = "MESSAGE_TEXT" ) private String text ; @ManyToOne (cascade = CascadeType. ALL ) @JoinColumn (name = "NEXT_MESSAGE_ID" ) private Message nextMessage ; private Message() {} public Message(String text) { this . text = text; } //gets e sets }
36.
37.
38.
39.
40.
41.
42. hibernate.cfg.xml < hibernate-configuration > < session-factory > <!-- Parâmetros de acesso a base de dados --> < property name = "connection.driver_class" > org.postgresql.Driver </ property > < property name = "connection.url" > jdbc:postgresql://localhost:5432/curso </ property > < property name = "connection.username" > postgresql </ property > < property name = "connection.password" > postgresql </ property > < property name = "dialect" > org.hibernate.dialect.PostgreSQLDialect </ property > ...
43. hibernate.cfg.xml ... <!-- Configuração do Pool de conexões --> < property name = "c3p0.min_size" > 5 </ property > < property name = "c3p0.max_size" > 20 </ property > < property name = "c3p0.timeout" > 300 </ property > < property name = "c3p0.max_statements" > 50 </ property > < property name = "c3p0.idle_test_period" > 3000 </ property > <!-- Exibe no console o SQL gerado pelo hibernate--> < property name = "show_sql" > true </ property > <!-- Cria e executa a DDL (tabelas, colunas, etc...)--> < property name = "hbm2ddl.auto" > create </ property > <!-- Informa as Entidades da aplicação --> < mapping class = "br.gov.serpro.curso.hibernate.exemplo1.Message" /> </ session-factory > </ hibernate-configuration >
44. Armazenando uma Mensagem //Obtendo o Session Session session = HibernateUtil.getSessionFactory().openSession(); //Iniciando a transação Transaction tx = session.beginTransaction(); // Criando uma mensagem Message message = new Message( "Hello World" ); // Salvando a Mensagem Long msgId = (Long) session.save(message); //Fazendo o commit da transação tx.commit(); //Fechando o Session session.close(); HibernateUtil.shutdown();
45.
46.
47. HibernateUtil public class HibernateUtil { private static SessionFactory sessionFactory ; static { sessionFactory = new AnnotationConfiguration().configure() .buildSessionFactory(); } public static SessionFactory getSessionFactory() { return sessionFactory ; } public static void shutdown() { getSessionFactory ().close(); } }
48. Recuperando as Mensagens Session newSession = HibernateUtil.getSessionFactory().openSession(); Transaction newTransaction = newSession.beginTransaction(); //Criando e executando uma consulta Query query = newSession .createQuery( "from Message m order by m.text asc" ); List<Message> messages = query.list(); //Retornando a quantidade de mensagens encontradas System. out .println(messages.size() + " message(s) found:" ); //Retornando as mensagens encontradas for (Message msg : messages) { System. out .println(msg.getText()); } newTransaction.commit(); newSession.close(); HibernateUtil.shutdown();
49.
50. Dirty Checking e Cascade Session thirdSession = HibernateUtil.getSessionFactory().openSession(); Transaction thirdTransaction = thirdSession.beginTransaction(); // recuperando a mensagem message = (Message) thirdSession.get(Message. class , msgId); //Alterando o texto message.setText( "Greetings Earthling" ); //Criando uma nova mensagem e associando à antiga message.setNextMessage( new Message( "Take me to your leader" )); thirdTransaction.commit(); thirdSession.close(); HibernateUtil.shutdown();
74. Mapeando Componentes @Embeddable public class Address { @Column (name = "ADDRESS_STREET" , nullable = false ) private String street ; @Column (name = "ADDRESS_CITY" , nullable = false ) private String city ; //gets e sets... }
75. Mapeando Componentes @Entity @Table (name = "USERS" ) public class User { @Id @GeneratedValue (strategy=GenerationType. AUTO ) private Long id ; private String name ; private String email ; private Address address ; //gets e sets }
102. Classe Item @Entity public class Item { @Id @GeneratedValue @Column (name = "ITEM_ID" ) private Long id ; private String name ; @CollectionOfElements @JoinTable (name = "ITEM_IMAGE" , joinColumns = @JoinColumn (name = "ITEM_ID" )) @Column (name = "FILENAME" , nullable = false ) private Set<String> images = new HashSet<String>(); }
103.
104.
105.
106.
107.
108.
109.
110. Classe Category public class Category { private String name ; private Category parentCategory ; private Set<Category> childCategories = new HashSet<Category>(); //gets e sets //... }
111. Mantendo a Consistência Category aParent = new Category(); Category aChild = new Category(); aChild.setParentCategory(aParent); aParent.getChildCategories().add(aChild);
123. Classe User @Entity @Table (name = "USERS" ) public class User { @Id @GeneratedValue (strategy=GenerationType. AUTO ) private Long id ; private String name ; @OneToOne @JoinColumn (name = "SHIPPING_ADDRESS_ID" ) private Address address ; }
124. Classe Address @Entity public class Address { @Id @GeneratedValue private Long id ; @Column (nullable = false ) private String street ; @OneToOne (mappedBy = "address" ) private User user ; }
128. Classe Category @Entity public class Category { @Id @GeneratedValue @Column (name = "CATEGORY_ID" ) private Long id ; private String name ; @ManyToMany @JoinTable (name = "CATEGORY_ITEM" , joinColumns = @JoinColumn (name = "CATEGORY_ID" ), inverseJoinColumns = @JoinColumn (name = "ITEM_ID" )) private Set<Item> items = new HashSet<Item>(); }
129. Classe Item @Entity public class Item { @Id @GeneratedValue @Column (name = "ITEM_ID" ) private Long id ; private String name ; @ManyToMany (mappedBy = "items" ) private Set<Category> categories = new HashSet<Category>(); }
132. Entidade User @Entity @Table (name = "USERS" ) public class User { @Id@GeneratedValue private Long id ; @OneToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "DEFAULT_BILLING_ID" ) private BillingDetails defaultBilling ; }
133. Polimorfismo e LazyLoading User user = (User) session.get(User. class , userId); BillingDetails bd = user.getDefaultBilling(); CreditCard cc = (CreditCard) session.load(CreditCard. class , bd.getId()); System. out .println(cc.getNumber()); User user = (User) session.get(User. class , userId); BillingDetails billingDetails = user.getDefaultBilling(); //imprime false System. out .println(billingDetails instanceof CreditCard); //ClassCastException CreditCard creditCard = (CreditCard) billingDetails;
153. Escopo limitado ao Contexto de Persistência Session session = HibernateUtil. getSessionFactory ().openSession(); Transaction transaction = session.beginTransaction(); Long id = (Long) session.save( new Message( "Hibernate" )); Message messageB = (Message) session.get(Message. class , id); Message messageC = (Message) session.get(Message. class , id); System. out .println(messageB.equals(messageC)); transaction.commit(); session.close(); Session session2 = HibernateUtil. getSessionFactory ().openSession(); Transaction transaction2 = session2.beginTransaction(); Message messageD = (Message) session2.get(Message. class , id); System. out .println(messageC.equals(messageD));
154.
155.
156.
157. Implementação public boolean equals(Object other) { if (!(other instanceof User)){ return false ; } User that = (User) other; return this . name .equals(that.getName()); } public int hashCode() { return this . name .hashCode(); }
158.
159.
160.
161. Armazenando um Objeto // Quando é instanciado, o item está no estado Transiente Item item = new Item(); item.setName( "Item 1" ); // um novo Session é aberto Session session = HibernateUtil. getSessionFactory ().openSession(); Transaction transaction = session.beginTransaction(); // O item passa para o estado Persistente e fica associado //ao Session e ao Contexto de Persistência session.save(item); //As mundanças são sincronizadas com a base de dados transaction.commit(); //O Session é fechado e o Contexto de Persistência encerrado. //O item passa para o estado Desconectado session.close();
163. Recuperando uma Entidade Session session = HibernateUtil. getSessionFactory ().openSession(); Transaction tx = session.beginTransaction(); //Item é recuperado no estado Transiente Item item = (Item) session.load(Item. class , new Long(1234)); // Item item = (Item) session.get(Item.class, new Long(1234)); tx.commit(); //Item passa para o estado Desconectado session.close();
169. De Persistente para Transiente Long id = armazenarItem (); Session session = HibernateUtil. getSessionFactory ().openSession(); Transaction tx = session.beginTransaction(); //Item no estado Persistente Item item = (Item) session.load(Item. class , id); //Item no estado Removido session.delete(item); tx.commit(); //Item no estado Transiente session.close();
188. Consultas: Exemplos // Através de HQL session.createQuery( "from Category c where c.name like 'Laptop%'" ); // Utilizando-se Criteria session.createCriteria(Category. class ).add( Restrictions. like ( "name" , "Laptop%" )); // Através de SQL session.createSQLQuery( "select {c.*} from CATEGORY {c} where NAME like 'Laptop%'" ) .addEntity( "c" , Category. class );
189.
190.
191.
192.
193.
194.
195. Executando a Consulta Query query = session.createQuery( "from User" ); List<User> list = query.list(); for (User user : list) { System. out .println(user.getName()); } Query query2 = session.createQuery( "from User user where user.name =:name" ).setString( "name" , "SUNSP" ); User user = (User) query2.uniqueResult(); System. out .println(user.getName());