2012-12-09 65 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 - 如果任何的異常的發生,這是因爲假設只有一個結果返回是錯誤的,應該將其作爲錯誤處理。