此时我开始研究基于MVC的小型Web应用程序。 现在我尝试使用DAO模式为Model布局实现主类。
所以,首先我创建了两个实体类(例如):Author和Book:
package myProject.model.entity;
import java.io.Serializable;
public class Author implements Serializable {
private static final long serialVersionUID = 7177014660621405534L;
private long id;
private String firstName;
private String lastName;
public Author() {
}
// getter and setter methods here
}
和Book class:
package myProject.model.entity;
import java.io.Serializable;
public class Book implements Serializable {
private static final long serialVersionUID = 7177014660621405534L;
private long id;
private String title;
private String description;
public Book() {
}
// getter and setter methods here
}
下一步,我看到,Book和Author类都有getId()
和setId()
。
所以,我为我的Entity类创建了接口Persistent
:
package myProject.model.entity;
public interface Persistent {
public long getId();
public void setId(long id);
}
所以,首先我的问题是:
这是model
包的正确实现吗?
在下一步中,我将启动包dao
的实现类。
package myProject.model.dao;
import java.util.List;
import myProject.model.entity.Persistent;
public interface Dao {
Persistent get(long id);
void save(Persistent persistent);
void delete(long id);
}
下一步:创建扩展基道AuthorDao
BookDao
和interface Dao
但是这两个界面:AuthorDao和BookDao--此时空无一人。 你觉得怎么样 - 通常,接口是空的?这是我的第二个问题。
在最后一步,我创建了包model.dao.hibernate
并将包添加到类AuthorDaoHibernate和BookDaoHibernate中 - 这两个类都实现了AuthorDao和BookDao接口。
现在我的主要问题是:
我的界面Dao
使用对象类型Persistent
,我不使用泛型。一切都还不错。
你认为我有什么好处,如果我重新工作Dao
界面机智:
package myProject.model.dao;
import java.util.List;
import myProject.model.entity.Persistent;
public interface Dao<Persistent> {
T get(long id);
List<T> getAll();
void save(T persistent);
void delete(long id);
}
我的Dao类仅适用于持久性实体 - 没有任何其他对象类型......
你真的有什么理由使用Generics吗?
答案 0 :(得分:2)
泛型可以极大地提高代码的可读性,并减少错误转换时可能产生的错误。
我们正在使用类似于您所描述的内容(请注意,需要接口和实现)。
这是一个基本的例子(我将把getters和setter留给brevitiy):
@MappedSuperClass
class BaseEntity {
@Id
private int id;
}
@Entity
class UserEnity extends BaseEntity {
//user stuff like name
}
class BaseDAO<T extends BaseEntity> {
public T findById(int id) {
...
}
//other generic CRUD methods
}
@Stateless
class UserDAO extends BaseDAO<UserEntity> {
//additional user specific methods
}
使用UserDAO就像这样:
UserDAO userDao; //some injection or lookup
//no explicit cast needed here, thanks to generics
UserEntity user = userDao.findById(userId);
//compiler error due to the generic parameter being UserEntity and AnotherEntity doesn't extend that
AnotherEntity a = userDao.findById(someId);
答案 1 :(得分:1)
如果你想使用泛型,你应该将Dao定义如下:
public interface Dao<T extends Persistent> {
.....................
void save(T persistent);
...................
}
现在,当你扩展它时,你将不得不创建只接受Book的保存:
public class Book extends Dao<Book> {
.....................
void save(Book persistent);
...................
}
此处的好处是您无法将Author
传递给BookDao
。这不会通过编译。
顺便说一句,如果您使用的是Hibernate,JPA或其他ORM解决方案,那么您实际上不必为每个实体创建DAO。一个通用dao可以解决您的所有需求。
答案 2 :(得分:0)
这里没有理由。如果它是独一无二的,根据定义,它不是通用的! 列表getAll()将执行作业。
ArrayList是Generic,因为它有时会返回Persistent,有时会返回总统。