Java JPA数据库类方法

Java JPA数据库类方法,java,database,spring-mvc,jpa,Java,Database,Spring Mvc,Jpa,我有一个Spring应用程序,它使用JPA存储Author对象。我已经编写了我的数据库类方法,因此使用了某种“模板”,以确保良好的操作。然而,我是一个新手,我不确定这是否总是必要的,甚至是想要的。欢迎提供有关最佳实践的任何意见或信息 模板 openConnection(); EntityTransaction transaction = this.em.getTransaction(); try { transaction.begin();

我有一个Spring应用程序,它使用JPA存储Author对象。我已经编写了我的数据库类方法,因此使用了某种“模板”,以确保良好的操作。然而,我是一个新手,我不确定这是否总是必要的,甚至是想要的。欢迎提供有关最佳实践的任何意见或信息

模板

    openConnection();
    EntityTransaction transaction = this.em.getTransaction();
    try {
        transaction.begin();
        //DO STUFF HERE
        transaction.commit();
    } catch (Exception e) {
        if(transaction.isActive()) {
            transaction.rollback();
        }
        throw new DatabaseException(e.getMessage(), e);
    } finally {
        closeConnection();
    }
整个数据库代码

public class AuthorDatabaseDerby implements AuthorDatabase {

    private static volatile AuthorDatabaseDerby uniqueInstance;
    private EntityManagerFactory emf;
    private EntityManager em;

    public static AuthorDatabaseDerby getInstance() {
        if(uniqueInstance == null) {
            synchronized(AuthorDatabaseDerby.class) {
                if(uniqueInstance == null) {
                    uniqueInstance = new AuthorDatabaseDerby();
                }
            }
        }
        return uniqueInstance;
    }

    private AuthorDatabaseDerby() {
        this.emf = Persistence.createEntityManagerFactory("bookstore");
    }

    private void openConnection() {
        this.em = this.emf.createEntityManager();
    }

    private void closeConnection() throws DatabaseException {
        try {
            if(this.em != null) {
                this.em.close();
            }
        } catch(Exception e) {
            throw new DatabaseException(e.getMessage(), e);
        }
    }

    @Override
    public Author get(int id) throws DatabaseException {
        openConnection();
        EntityTransaction transaction = this.em.getTransaction();
        try {
            transaction.begin();
            Author author = this.em.find(Author.class, id);
            transaction.commit();
            return author;
        } catch (Exception e) {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            throw new DatabaseException(e.getMessage(), e);
        } finally {
            closeConnection();
        }
    }

    @Override
    public List<Author> getAll() throws DatabaseException {
        openConnection();
        EntityTransaction transaction = this.em.getTransaction();
        try {
            transaction.begin();
            List<Author> authors = this.em.createQuery("Select a From Author a", Author.class).getResultList();
            transaction.commit();
            return authors;
        } catch(Exception e) {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            throw new DatabaseException(e.getMessage(), e);
        } finally {
            closeConnection();
        }
    }

    @Override
    public void add(Author author) throws DatabaseException {
        openConnection();
        EntityTransaction transaction = this.em.getTransaction();
        try {
            transaction.begin();
            this.em.persist(author);
            transaction.commit();
        } catch(Exception e) {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            throw new DatabaseException(e.getMessage(), e);
        } finally {
            closeConnection();
        }
    }

    @Override
    public void update(Author author) throws DatabaseException {
        openConnection();
        EntityTransaction transaction = this.em.getTransaction();
        try {
            transaction.begin();

            Author a = this.em.find(Author.class, author.getId());
            a.setBooks(author.getBooks());
            a.setDateBirth(author.getDateBirth());
            a.setDateDeceased(author.getDateDeceased());
            a.setFirstName(author.getFirstName());
            a.setId(author.getId());
            a.setLastName(author.getLastName());
            a.setNationality(author.getNationality());

            transaction.commit();
        } catch(Exception e) {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            throw new DatabaseException(e.getMessage(), e);
        } finally {
            closeConnection();
        }
    }

    @Override
    public void delete(int id) throws DatabaseException {
        openConnection();
        EntityTransaction transaction = this.em.getTransaction();
        try {
            transaction.begin();
            Author author = this.em.find(Author.class, id);
            this.em.remove(author);
            transaction.commit();
        } catch(Exception e) {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            throw new DatabaseException(e.getMessage(), e);
        } finally {
            closeConnection();
        }
    }

    @Override
    public void close() throws DatabaseException {
        try {
            if(this.emf != null) {
                this.emf.close();
            }
        } catch(Exception e) {
            throw new DatabaseException(e.getMessage(), e);
        }
    }

}
公共类AuthorDatabaseDerby实现AuthorDatabase{ 私有静态易失性AuthorDatabaseDerby uniqueInstance; 私人实体管理工厂emf; 私人实体管理者; 公共静态AuthorDatabaseDerby getInstance(){ if(uniqueInstance==null){ 已同步(AuthorDatabaseDerby.class){ if(uniqueInstance==null){ uniqueInstance=new AuthorDatabaseDerby(); } } } 返回唯一实例; } 私有AuthorDatabaseDerby(){ this.emf=Persistence.createEntityManagerFactory(“书店”); } 私有void openConnection(){ this.em=this.emf.createEntityManager(); } 私有void closeConnection()引发DatabaseException{ 试一试{ 如果(this.em!=null){ 这个.em.close(); } }捕获(例外e){ 抛出新的数据库异常(e.getMessage(),e); } } @凌驾 public Author get(int id)引发DatabaseException{ openConnection(); EntityTransaction=this.em.getTransaction(); 试一试{ transaction.begin(); Author=this.em.find(Author.class,id); commit(); 返回作者; }捕获(例外e){ if(transaction.isActive()){ transaction.rollback(); } 抛出新的数据库异常(e.getMessage(),e); }最后{ closeConnection(); } } @凌驾 public List getAll()引发DatabaseException{ openConnection(); EntityTransaction=this.em.getTransaction(); 试一试{ transaction.begin(); List authors=this.em.createQuery(“从Author a中选择一个”,Author.class).getResultList(); commit(); 返回作者; }捕获(例外e){ if(transaction.isActive()){ transaction.rollback(); } 抛出新的数据库异常(e.getMessage(),e); }最后{ closeConnection(); } } @凌驾 public void add(Author-Author)引发DatabaseException{ openConnection(); EntityTransaction=this.em.getTransaction(); 试一试{ transaction.begin(); 这个.em.persist(作者); commit(); }捕获(例外e){ if(transaction.isActive()){ transaction.rollback(); } 抛出新的数据库异常(e.getMessage(),e); }最后{ closeConnection(); } } @凌驾 公共无效更新(作者)引发DatabaseException{ openConnection(); EntityTransaction=this.em.getTransaction(); 试一试{ transaction.begin(); Author a=this.em.find(Author.class,Author.getId()); a、 setBooks(author.getBooks()); a、 setDateBirth(author.getDateBirth()); a、 setDateDeaster(author.getDateDeaster()); a、 setFirstName(author.getFirstName()); a、 setId(author.getId()); a、 setLastName(author.getLastName()); a、 setNationary(author.getNationary()); commit(); }捕获(例外e){ if(transaction.isActive()){ transaction.rollback(); } 抛出新的数据库异常(e.getMessage(),e); }最后{ closeConnection(); } } @凌驾 公共void delete(int id)引发DatabaseException{ openConnection(); EntityTransaction=this.em.getTransaction(); 试一试{ transaction.begin(); Author=this.em.find(Author.class,id); this.em.remove(作者); commit(); }捕获(例外e){ if(transaction.isActive()){ transaction.rollback(); } 抛出新的数据库异常(e.getMessage(),e); }最后{ closeConnection(); } } @凌驾 public void close()引发DatabaseException{ 试一试{ 如果(this.emf!=null){ this.emf.close(); } }捕获(例外e){ 抛出新的数据库异常(e.getMessage(),e); } } }
我不会使用这些代码

与您的模板相比,我更喜欢Spring事务管理。它是基于注释和配置的

我会使用连接池而不是您的连接类


既然可以使用Spring已经提供的功能,为什么还要编写代码呢?他们编写的代码比你我都好。有更广泛的用户群体来发现bug

谢谢你的回答。然而,这是一项学校作业,我被支持将我的业务逻辑与框架解耦,因此我不能使用Spring transaction management.OK。当然,你可以忽略你在这里读到的任何东西。您要求提供最佳实践—您的代码不是最佳实践。没有共享。您可以将此视为一个更好的示例,可以进行模拟。您可以随意查看Spring源代码,看看他们对设计的看法。听起来您是在寻求批准,而不是建议或建议。