2012-12-09 69 views
1

我是JPA的新手,我正在尝试一些入门示例项目。我尝试了GraniteDS示例项目(“Hello,World”app),并且发现更新或插入java bean的方法hello。它对我来说看起来不太好,但另一方面,我不确定它应该看起来更好。Java bean持久化模式

UPDATE 我不喜欢这样的查询必须抛出一个异常,要知道,与Welcome实体没有结果存在。有没有办法以优雅的方式检查是否有任何记录?

package info.alekna.project.services; 

import java.util.List; 
import java.util.Date; 
import java.text.SimpleDateFormat; 

import javax.persistence.Query; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.NoResultException; 

import org.granite.tide.data.DataEnabled; 
import org.granite.tide.data.DataEnabled.PublishMode; 


import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import info.alekna.project.entities.Welcome; 


@Service 
@DataEnabled(topic="welcomeTopic", publish=PublishMode.ON_SUCCESS) 
public class WelcomeServiceImpl implements WelcomeService { 

    @PersistenceContext 
    private EntityManager entityManager; 


    @Transactional 
    public Welcome hello(String name) { 
     if (name == null || name.trim().length() == 0) 
      throw new RuntimeException("Name cannot be null or empty"); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     Welcome welcome = null; 
     try { 
      Query q = entityManager.createQuery("select w from Welcome w where w.name = :name"); 
      q.setParameter("name", name); 
      welcome = (Welcome)q.getSingleResult(); 
      welcome.setMessage("Welcome " + name + " (" + sdf.format(new Date()) + ")"); 
     } 
     catch (NoResultException e) { 
      welcome = new Welcome(); 
      welcome.setName(name); 
      welcome.setMessage("Welcome " + name + " (" + sdf.format(new Date()) + ")"); 
      entityManager.persist(welcome); 
     } 
     return welcome; 
    } 


    @Transactional(readOnly=true) 
    public List<Welcome> findAll() { 
     return entityManager.createQuery("select w from Welcome w order by w.name", Welcome.class).getResultList(); 
    } 
} 
+1

到底是什么你问这个问题? – vainolo

+0

@vainolo我不喜欢那个查询必须抛出一个异常,以知道欢迎实体没有结果存在。有什么方法可以检查有没有优雅的记录? –

回答

1

(回答评论中的问题) 您总是可以使用q.getResultList()并检查列表的大小。这样做的问题是它会导致表格上的完整运行,如果不需要,应该避免。

这是一种合乎逻辑的扔NoResultException如果你显式调用getSingleResult,因为它是一个特殊的状态:-)

1

嗯,你可以呼吁QuerygetResultList()和检查导致Listsize()正好是一个。

但如果你是绝对肯定的是,查询必须恰好返回一个结果,然后是有意义的调用getSingleResult()和她俩都NoResultExceptionNonUniqueResultException - 如果任何的异常的发生,这是因为假设只有一个结果返回是错误的,应该将其作为错误处理。