Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Articles
Articles_pt
CreateManager_pt
LeftMenu




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateDAO_pt


Difference between version 36 and version 14:

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).

Back to CreateDAO_pt, or to the Page History.