JAVA JPA - 持久化项目中所有对象的常规解决方案
JAVA JPA - Regular solution to persist all objects in project
我正在开发创建新用户、新闻、各种数据等的后端。
到目前为止,我可以在数据库中创建并保存一个新用户。我认为还会有许多其他实体也有关系。此时我只看到两种持久化数据的方法:
- 创建 CreateXY、UpdateXY 和 DeleteXY 类
- 或者在每个实体对象中编写持久化方法
我认为一遍又一遍地写坚持是安静的多余。有什么好的方法可以很好地持久化对象吗?
Main.java
package database;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import backend.User;
public class Main {
private static final Logger LOGGER = Logger.getLogger("JPA");
public static void main(String[] args) {
Main main = new Main();
main.run();
}
public void run() {
EntityManagerFactory factory = null;
EntityManager entityManager = null;
try {
System.out.println("START");
factory = Persistence.createEntityManagerFactory("shareiffUnit");
System.out.println("END");
entityManager = factory.createEntityManager();
persistPerson(entityManager);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
e.printStackTrace();
} finally {
if (entityManager != null) {
entityManager.close();
}
if (factory != null) {
factory.close();
}
}
}
private void persistPerson(EntityManager entityManager) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
User person = new User();
person.setName("Homer");
person.setPassword("Simpson");
entityManager.persist(person);
transaction.commit();
} catch (Exception e) {
if (transaction.isActive()) {
transaction.rollback();
}
}
}
}
User.java
package backend;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table
public class User {
@Id
@GeneratedValue
private int id;
private String name;
private String password;
private Boolean isActive = false;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
}
我倾向于有一组类似经理的 classes 以及每个经理的基础 class。基础是这样的:
public class SomeBaseWritableDAO<T> {
@PersistenceContext
private EntityManager entityManager;
protected EntityManager getEntityManager() {
return entityManager;
}
public void save(T entity) {
getEntityManager().persist(entity);
}
public T update(T entity) {
return getEntityManager().merge(entity);
}
public void delete(T entity) {
getEntityManager().remove(entity);
}
}
它处理任何 @Entity
类型。然后,如果我需要的不仅仅是基本的 CRUD 操作,我将创建一个 class 特定的管理器:
public class SpecificDAO extends SomeBaseWritableDAO<SpecificEntity> {
public SpecificEntity findBySomeCode(String inviteCode) {
final String queryString = "select model from SomeEntity model " +
"where model.code= :inviteCode";
Query query = getEntityManager().createQuery(queryString);
query.setParameter("inviteCode", inviteCode);
try {
return (SomeEntity) (query.getSingleResult());
}
catch( NoResultException nre ) {
return null;
}
}
}
还有其他方法可以做到这一点,但这种模式在过去效果很好。如果您有一个设计合理且具有参照完整性的数据库,那么像 Eclipse 或 IntelliJ 中的逆向工程工具可以生成您的一对一和一对多关系。
我正在开发创建新用户、新闻、各种数据等的后端。
到目前为止,我可以在数据库中创建并保存一个新用户。我认为还会有许多其他实体也有关系。此时我只看到两种持久化数据的方法:
- 创建 CreateXY、UpdateXY 和 DeleteXY 类
- 或者在每个实体对象中编写持久化方法
我认为一遍又一遍地写坚持是安静的多余。有什么好的方法可以很好地持久化对象吗?
Main.java
package database;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import backend.User;
public class Main {
private static final Logger LOGGER = Logger.getLogger("JPA");
public static void main(String[] args) {
Main main = new Main();
main.run();
}
public void run() {
EntityManagerFactory factory = null;
EntityManager entityManager = null;
try {
System.out.println("START");
factory = Persistence.createEntityManagerFactory("shareiffUnit");
System.out.println("END");
entityManager = factory.createEntityManager();
persistPerson(entityManager);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
e.printStackTrace();
} finally {
if (entityManager != null) {
entityManager.close();
}
if (factory != null) {
factory.close();
}
}
}
private void persistPerson(EntityManager entityManager) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
User person = new User();
person.setName("Homer");
person.setPassword("Simpson");
entityManager.persist(person);
transaction.commit();
} catch (Exception e) {
if (transaction.isActive()) {
transaction.rollback();
}
}
}
}
User.java
package backend;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table
public class User {
@Id
@GeneratedValue
private int id;
private String name;
private String password;
private Boolean isActive = false;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
}
我倾向于有一组类似经理的 classes 以及每个经理的基础 class。基础是这样的:
public class SomeBaseWritableDAO<T> {
@PersistenceContext
private EntityManager entityManager;
protected EntityManager getEntityManager() {
return entityManager;
}
public void save(T entity) {
getEntityManager().persist(entity);
}
public T update(T entity) {
return getEntityManager().merge(entity);
}
public void delete(T entity) {
getEntityManager().remove(entity);
}
}
它处理任何 @Entity
类型。然后,如果我需要的不仅仅是基本的 CRUD 操作,我将创建一个 class 特定的管理器:
public class SpecificDAO extends SomeBaseWritableDAO<SpecificEntity> {
public SpecificEntity findBySomeCode(String inviteCode) {
final String queryString = "select model from SomeEntity model " +
"where model.code= :inviteCode";
Query query = getEntityManager().createQuery(queryString);
query.setParameter("inviteCode", inviteCode);
try {
return (SomeEntity) (query.getSingleResult());
}
catch( NoResultException nre ) {
return null;
}
}
}
还有其他方法可以做到这一点,但这种模式在过去效果很好。如果您有一个设计合理且具有参照完整性的数据库,那么像 Eclipse 或 IntelliJ 中的逆向工程工具可以生成您的一对一和一对多关系。