At line 59 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 96 changed 1 line. |
[schemaexport] id BIGINT NOT NULL AUTO_INCREMENT, |
[schemaexport] id bigint not null, |
At line 101 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 166 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 178 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 180 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 186 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 190 removed 1 line. |
|
At line 193 removed 3 lines. |
|
//~ Instance fields ======================================================== |
|
At line 199 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 204 removed 8 lines. |
|
protected void tearDown() { |
dao = null; |
} |
|
public static void main(String[] args) { |
junit.textui.TestRunner.run(PersonDaoTest.class); |
} |
At line 215 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 244 changed 1 line. |
assertTrue(person.getLastName().equals("Last Name Updated")); |
assertEquals(person.getLastName(), "Last Name Updated"); |
At line 249 added 1 line. |
|
At line 262 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 303 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 311 removed 2 lines. |
import java.util.List; |
|
At line 314 removed 3 lines. |
|
public List getPeople(Person person); |
|
At line 318 changed 3 lines. |
|
public void savePerson(Object person); |
|
public void savePerson(Person person); |
At line 335 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 341 removed 2 lines. |
import java.util.List; |
|
At line 345 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 347 changed 3 lines. |
public List getPeople(Person person) { |
return getHibernateTemplate().find("from Person"); |
} |
if (person == null) { |
throw new ObjectRetrievalFailureException(Person.class, id); |
} |
At line 351 changed 2 lines. |
public Person getPerson(Long id) { |
return (Person) getHibernateTemplate().get(Person.class, id); |
return person; |
At line 355 changed 1 line. |
public void savePerson(Object person) { |
public void savePerson(Person person) { |
At line 360 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 366 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 400 removed 2 lines. |
<value>org/appfuse/model/UserCookie.hbm.xml</value> |
<value>org/appfuse/model/UserRole.hbm.xml</value> |
At line 430 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). |