Java JPA数据库类方法
我有一个Spring应用程序,它使用JPA存储Author对象。我已经编写了我的数据库类方法,因此使用了某种“模板”,以确保良好的操作。然而,我是一个新手,我不确定这是否总是必要的,甚至是想要的。欢迎提供有关最佳实践的任何意见或信息 模板Java JPA数据库类方法,java,database,spring-mvc,jpa,Java,Database,Spring Mvc,Jpa,我有一个Spring应用程序,它使用JPA存储Author对象。我已经编写了我的数据库类方法,因此使用了某种“模板”,以确保良好的操作。然而,我是一个新手,我不确定这是否总是必要的,甚至是想要的。欢迎提供有关最佳实践的任何意见或信息 模板 openConnection(); EntityTransaction transaction = this.em.getTransaction(); try { transaction.begin();
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源代码,看看他们对设计的看法。听起来您是在寻求批准,而不是建议或建议。