我有一个使用JPA存储Author对象的Spring应用程序。我写了我的数据库类方法,以便使用某个“模板”,以确保良好的操作。但是,我是一个新手,我不确定这是否总是必要或甚至是想要的。欢迎任何有关最佳实践的意见或信息!JPA数据库类方法
模板
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);
}
}
}
听起来像你正在寻求批准,而不是建议或建议。 – duffymo