| At line 11 added 9 lines. |
| %%note __NOTA:__ Se você está usando MySQL e quer usar transações (provavelmente usará) você tem de usar tabelas InnoDB. Para fazê-lo, adicione o seguinte ao seu arquivo mysql de configurações (/etc/my.cnf ou c:\Windows\my.ini). O segundo ajuste (para um character set UTF-8) é necessário para a versão 4.1.7+. |
| {{{ |
| [mysqld] |
| default-table-type=innodb |
| default-character-set=utf8 |
| }}} |
| Se você está usando PostgreSQL e obtém erros confusos sobre processamento batch, tente desabilitá-lo adicionando {{<prop key="hibernate.jdbc.batch_size">0</prop>}} ao seu arquivo src/dao/**/hibernate/applicationContext-hibernate.xml. |
| %% |
|
| At line 50 changed 1 line. |
| No fragmento de código acima, nós estamos extendendo [BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html] porque ela contem os seguintes métodos úteis: toString(), equals(), hashCode() - os dois últimos são requeridos pelo Hibernate. |
| Esta classe deve extender [BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html], a qual tem 3 métodos abstratos: (equals(), hashCode() and toString()) que você precisará implementar na classe Pessoa. Os dois primeiros são requeridos pelo Hibernate. A maneira mais simples de fazer isto é usando [Commonclipse|http://commonclipse.sf.net]. Mais informações em usar esta ferramenta pode ser encontrada em [Lee Grey's site|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]. Outro Eclipse Plugin que você pode usar é [Commons4E|http://commons4e.berlios.de/]. Eu não o usei, assim eu não posso comentar sua funcionalidade. |
| At line 61 added 2 lines. |
| ;:''Se você está usando [IntelliJ IDEA|http://www.jetbrains.com/idea], você pode gerar equals() and hashCode(), mas não toString(). Há um [ToStringPlugin|http://www.intellij.org/twiki/bin/view/Main/ToStringPlugin], mas não o testei pessoalmente.'' |
|
| At line 87 changed 1 line. |
| [schemaexport] id BIGINT NOT NULL AUTO_INCREMENT, |
| [schemaexport] id bigint not null, |
| At line 92 changed 1 line. |
| Se você quiser procurar o arquivo Pessoa.hbm.xml que Hibernate gera para você, procure no diretório build/dao/gen/**/hibernate. Aqui está o conteúdo do Pessoa.hbm.xml (até aqui): |
| Se você quiser procurar o arquivo Pessoa.hbm.xml que Hibernate gera para você, procure no diretório build/dao/gen/**/model. Aqui está o conteúdo do Pessoa.hbm.xml (até aqui): |
| At line 157 changed 3 lines. |
| [schemaexport] id BIGINT NOT NULL, |
| [schemaexport] first_name VARCHAR(255), |
| [schemaexport] last_name VARCHAR(255), |
| [schemaexport] id bingint NOT NULL, |
| [schemaexport] first_name varchar(255), |
| [schemaexport] last_name varchar(255), |
| At line 178 added 2 lines. |
| %%note <a name="appgen"></a>__NOTE:__ AppFuse versions 1.6.1+ contain include an [AppGen] tool that can be used to generate all the classes for the rest of these tutorials. However, it's best that you go through these tutorials before using this tool - then you'll know what code it's generating.%% |
|
| At line 169 changed 1 line. |
| Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para automaticamente carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável rb. |
| Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], sub-classe da classe [AbstractDependencyInjectionSpringContextTests|http://www.springframework.org/docs/api/org/springframework/test/AbstractDependencyInjectionSpringContextTests.html] do Spring que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para (opcionalmente) carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável rb. |
| At line 171 changed 1 line. |
| ;:%%(color: blue)''Usualmente copio (abrir salvar como) um teste existente (ex.: UserDaoTest.java) e procurar/substituir [Uu]ser com [Pp]essoa, ou qualquer que seja o nome do meu objeto.''%% |
| ;:%%(color: blue)''Usualmente copio (abrir salvar como) um teste existente (ex.: UserDaoTest.java) e procurar/substituir [[Uu]ser com [[Pp]essoa, ou qualquer que seja o nome do meu objeto.''%% |
| At line 177 removed 2 lines. |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| At line 191 added 1 line. |
| import org.springframework.dao.DataAccessException; |
| At line 181 removed 1 line. |
|
| At line 184 removed 3 lines. |
|
| //~ Instance fields ======================================================== |
|
| At line 190 changed 4 lines. |
| //~ Methods ================================================================ |
| protected void setUp() { |
| log = LogFactory.getLog(PersonDaoTest.class); |
| dao = (PersonDao) ctx.getBean("personDao"); |
| public void setPersonDao(PersonDao dao) { |
| this.dao = dao; |
| At line 195 removed 8 lines. |
|
| protected void tearDown() { |
| dao = null; |
| } |
|
| public static void main(String[] args) { |
| junit.textui.TestRunner.run(PersonDaoTest.class); |
| } |
| At line 206 changed 1 line. |
| O código que você vê acima é o que precisamos para um teste JUnit básico, que inicializa e destrói nosso PessoaDAO. O objeto ctx é uma referência ao ApplicationContext do Spring, o qual é inicializado em um bloco estático da classe [BaseDaoTestCase's|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html] class. |
| O código que você vê acima é o que precisamos para um teste de integração Spring básico que inicializa e destrói nosso PessoaDAO. Spring irá usar autowiring (auto-ligamento) por tipo para chamar o método ''setPersonDao()'' e atribuir o bean "personDao" como uma dependência desta classe. |
| At line 225 added 1 line. |
|
| At line 235 changed 1 line. |
| assertTrue(person.getLastName().equals("Last Name Updated")); |
| assertEquals(person.getLastName(), "Last Name Updated"); |
| At line 249 added 1 line. |
|
| At line 253 changed 1 line. |
| assertNull(dao.getPerson(person.getId())); |
|
| try { |
| person = dao.getPerson(person.getId()); |
| fail("Person found in database"); |
| } catch (DataAccessException dae) { |
| log.debug("Expected exception: " + dae.getMessage()); |
| assertNotNull(dae); |
| } |
| At line 294 changed 1 line. |
| Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização.'' |
| Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização. |
| At line 302 removed 2 lines. |
| import java.util.List; |
|
| At line 305 removed 3 lines. |
|
| public List getPeople(Person person); |
|
| At line 309 changed 3 lines. |
|
| public void savePerson(Object person); |
|
| public void savePerson(Person person); |
| At line 326 removed 3 lines. |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
|
| At line 328 added 1 line. |
| import org.springframework.orm.ObjectRetrievalFailureException; |
| At line 332 removed 2 lines. |
| import java.util.List; |
|
| At line 336 changed 1 line. |
| private Log log = LogFactory.getLog(PersonDaoHibernate.class); |
| public Person getPerson(Long id) { |
| Person person = (Person) getHibernateTemplate().get(Person.class, id); |
| At line 338 changed 3 lines. |
| public List getPeople(Person person) { |
| return getHibernateTemplate().find("from Person"); |
| } |
| if (person == null) { |
| throw new ObjectRetrievalFailureException(Person.class, id); |
| } |
| At line 342 changed 2 lines. |
| public Person getPerson(Long id) { |
| return (Person) getHibernateTemplate().get(Person.class, id); |
| return person; |
| At line 346 changed 1 line. |
| public void savePerson(Object person) { |
| public void savePerson(Person person) { |
| At line 351 changed 2 lines. |
| Object person = getHibernateTemplate().load(Person.class, id); |
| getHibernateTemplate().delete(person); |
| // object must be loaded before it can be deleted |
| getHibernateTemplate().delete(getPerson(id)); |
| At line 357 removed 21 lines. |
|
| Você notará aqui que não estamos fazendo nada com o parâmetro pessoa. Isto é somente um place holder por enquanto no futuro você pode filtrar suas propriedades usando [Hibernate's Query Language|http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html] (HQL) ou usando [Criteria Queries|http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html]. |
|
| ''Um exemplo usando Criteria Query:'' |
|
| [{Java2HtmlPlugin |
|
| Example example = Example.create(person) |
| .excludeZeroes() //exclude zero valued properties |
| .ignoreCase(); //perform case insensitive string comparisons |
| try { |
| return getSession().createCriteria(Person.class) |
| .add(example) |
| .list(); |
| } catch (Exception e) { |
| throw new DAOException(e); |
| } |
| return new ArrayList(); |
|
| }] |
|
| At line 391 removed 2 lines. |
| <value>org/appfuse/model/UserCookie.hbm.xml</value> |
| <value>org/appfuse/model/UserRole.hbm.xml</value> |
| At line 421 changed 1 line. |
| ''Next Up:'' __Part II:__ [Creating new Managers|CreateManager] - A HowTo for creating [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] that talk to the database tier (DAOs) and the web tier (Struts Actions). |
| ''Próxima:'' __Parte II:__ [Criando novos Managers|CreateManager_pt] - Um "HowTo" para criar [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] que comunicam-se com a camada de banco de dados (DAOs) e web (Spring Controllers). |