2015-09-17 28 views
2

介紹Web服務響應不更新,數據庫互爲作用

我有由一個RESTful Web服務一個JavaEE應用。這個WS負責接收一些請求並用XML來回答。有服務來存儲和服務來捕獲MySQL DB的信息。
該系統使用API​​(如JAX-WS和JAX-B)以及框架Hibernate來實現數據持久性。

問題

當我更新,刪除或我的數據庫直接或通過WS的服務塞入任何東西,並試圖通過服務來查看結果,差異沒有按」除非我重新啓動WS,否則會出現。

可能性

我相信這是Hibernate的緩存,但我沒有找到任何東西,幫我解決這個問題。

有沒有人有這個問題?任何想法?

hibernate.cfg.xml中:

@GET 
@Path("/getResourceByIdXML/{id}") 
@Produces(MediaType.APPLICATION_XML) 
public CsResource getResourceByIdXML(@PathParam("id")Long id) {  
    return new DAOResource().find(id); 
} 

類:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/context_server</property> 
    <property name="hibernate.connection.username">user</property> 
    <property name="hibernate.connection.password"></property> 

    <mapping class="br.marcelo.bean.CsMediaAudio"/> 
    <mapping class="br.marcelo.bean.CsMediaImage"/> 
    <mapping class="br.marcelo.bean.CsMediaVideo"/> 
    <mapping class="br.marcelo.bean.CsContext"/> 
    <mapping class="br.marcelo.bean.CsMedia"/> 
    <mapping class="br.marcelo.bean.CsResource"/> 
    <mapping class="br.marcelo.bean.CsUser"/> 
    </session-factory> 
</hibernate-configuration> 

獲取信息的服務DAOResource與找到方法上面使用:

public class DAOResource extends DAOGenerics<CsResource, Long> { 
    private final Session s; 

    public DAOResource() 
    { 
     s = HibernateSessionFactory.getSession(); 
    } 

    @Override 
    public CsResource find(Long id) { 
     try { 
      s.flush(); 
      s.clear(); 
      String sql = "from CsResource where id = :id"; 
      Query qr = s.createQuery(sql); 
      qr.setParameter("id", id); 

      return (CsResource) qr.uniqueResult(); 

     }catch(HibernateException e){ 
      System.out.println(e); 
      return null; 
     } finally { 
      s.close(); 
     } 
    } 
} 

HibernateSession

public class HibernateSessionFactory { 

    private static SessionFactory sf; 
    static 
    { 
     try 
     { 
      sf = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory(); 
     } 
     catch (Exception erro) 
     { 
      System.err.println(erro); 
      sf = null; 
     } 
    } 

    public static Session getSession() 
    { 
     return sf.openSession(); 
    } 


    public static Connection getConnection(){ 

     try { 
      SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) sf; 
      ConnectionProvider connectionProvider = (ConnectionProvider)sessionFactoryImplementation.getConnectionProvider(); 

      java.sql.Connection connection = connectionProvider.getConnection();    

      return connection; 
     } catch (SQLException ex) { 
      Logger.getLogger(HibernateSessionFactory.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     return null; 
    } 

} 

編輯::與的getSession方法工廠類以上使用

DAOGenerics類()齊平的呼叫和清除()方法

public abstract class DAOGenerics<K, G> { 

    private final Session s; 

    public DAOGenerics() 
    { 
     s = HibernateSessionFactory.getSession(); 
    } 

    public abstract K buscar(G obj); 

    public abstract List<K> buscarTodos(); 

    public boolean inserir(K obj){ 
     try { 
      s.flush(); 
      s.clear(); 
      s.getTransaction().begin(); 
      s.saveOrUpdate(obj);     
      s.getTransaction().commit(); 
      s.close(); 
      return true; 
     } 
     catch (HibernateException erro){ 

      System.out.println(erro.getMessage()); 
      s.flush(); 
      s.clear(); 
      s.getTransaction().rollback(); 
      s.close(); 
      return false; 
     } 

    } 

    public void apagar(K obj) { 
     try { 
      apagar(obj, s); 
     } finally { 
      s.flush(); 
      s.clear(); 
      s.close(); 
     } 
    } 

    public void apagar(K obj, Session s) { 

     try { 
      s.flush(); 
      s.clear(); 
      s.getTransaction().begin(); 
      s.delete(obj);     
      s.getTransaction().commit(); 
     } 
     catch (HibernateException erro){ 
      System.out.println(erro); 
      s.flush(); 
      s.clear(); 
      s.getTransaction().rollback(); 
     }finally{ 
      s.close(); 
     } 
    } 


} 

回答

0

是的,如果你改變了hibernate「視圖」之外的東西,hibernate緩存並沒有意識到這一點。所以有兩個選項:

+0

我已經使用刪除/更新與休眠,但是這並不能解決問題,因爲同樣的問題發生,因爲是正常的數據庫直接更改測試。我已經在我的DAO類中使用了flush方法,但問題仍然存在。我會在帖子後面顯示我的帖子 –

+0

我的代碼仍然使用他statelessSession接口 –

+0

Flush是寫入,清除是:再見緩存。你能測試清楚嗎? –