iva*_*590 3 java entity dao jpa eclipselink
首先,抱歉我的英语.
我为朋友制作了一个访问SQLite数据库的JPA(EclipseLink)桌面应用程序.
我已经在Eclipse中创建了数据库和实体.但我还创建了一个名为class的类UniversalDAO,它是所有实体用来访问和持久化数据库的实用程序类:
package model.DAO;
import java.util.ArrayList;
import javax.persistence.*;
import model.entities.Entities;
public class UniversalDAO {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("TheDatabase");
private static EntityManager em = emf.createEntityManager();
private UniversalDAO (){}
public static void close(){
em.close();
emf.close();
}
public static Entities getOne(Class<? extends Entities> table, Object primaryKey) {
return em.find(table, primaryKey);
}
public static ArrayList<Entities> getAll(Class<? extends Entities> table) {
ArrayList<Entities> ret = new ArrayList<>();
for(Object obj : em.createQuery("SELECT o FROM " + table.getName() + " o").getResultList())
ret.add((Entities) obj);
return ret;
}
public static ArrayList<Entities> getWithCondition(Class<? extends Entities> table, String condition) {
ArrayList<Entities> ret = new ArrayList<>();
for(Object obj : em.createQuery("SELECT o FROM " + table.getName() + " o WHERE " + condition).getResultList())
ret.add((Entities) obj);
return ret;
}
public static void insert(Entities row) {
em.getTransaction().begin();
em.persist(row);
em.flush();
em.getTransaction().commit();
}
public static void update(Entities row) {
em.getTransaction().begin();
em.merge(row);
em.flush();
em.getTransaction().commit();
}
public static void delete(Class<? extends Entities> table, Object primaryKey) {
em.getTransaction().begin();
Entities row = em.find(table, primaryKey);
em.remove(row);
em.flush();
em.getTransaction().commit();
}
}
Run Code Online (Sandbox Code Playgroud)
为了分组所有的entites并在这个类中使用它我创建了一个名为的空接口Entities.
这是其中一个实体的样子:
package model.entities;
import java.util.ArrayList;
import javax.persistence.*;
@Entity
@Table(name="emails")
public class EntityEmail implements Entities {
@Id
@Column(name="id_email")
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int idEmail;
@Column(name="email")
private String email;
@Column(name="description")
private String description;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="people_emails",
joinColumns=@JoinColumn(name="id_email", referencedColumnName="id_email"),
inverseJoinColumns=@JoinColumn(name="id_person", referencedColumnName="id_person"))
private ArrayList<EntityPerson> people;
public EntityEmail() {
}
public int getIdEmail() {
return this.idEmail;
}
public void setIdEmail(int idEmail) {
this.idEmail = idEmail;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ArrayList<EntityPerson> getPeople() {
return people;
}
public void setPeople(ArrayList<EntityPerson> people) {
this.people = people;
}
}
Run Code Online (Sandbox Code Playgroud)
就像你可以欣赏我不是一个专业人士,我仍然有很多东西需要学习.所以,我想知道这种方法是否正确,或者我是否应该为每个实体都有一个DAO.
看起来你试图发明Generic DAO模式.如果是这样,你基本上是正确的方式.
通用DAO模式的工作原理如下:
创建一个所有DAO将扩展的通用基类:
public abstract class GenericDao<E, ID extends Serializable> {
...
// Implement common operations that are relevant to all entities here:
public E findById(ID id) { ... }
public void save(E entity) { ... }
// etc
...
}
Run Code Online (Sandbox Code Playgroud)通过扩展创建具体的DAO实现GenericDao:
public class EntityEmailDao extends GenericDao<EntityEmail, Integer> {
// This class may contain operations that are relevant to specific entity:
public E findByEmail(String email) { ... }
}
Run Code Online (Sandbox Code Playgroud)由于GenericDao是通用的,因此您无需使实体扩展任何通用接口
这个模式有很多现有的实现,例如,看看这里.
| 归档时间: |
|
| 查看次数: |
2872 次 |
| 最近记录: |