Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未使用数据库交互更新Web服务响应_Java_Mysql_Hibernate_Web Services_Rest - Fatal编程技术网

Java 未使用数据库交互更新Web服务响应

Java 未使用数据库交互更新Web服务响应,java,mysql,hibernate,web-services,rest,Java,Mysql,Hibernate,Web Services,Rest,导言 我有一个包含在RESTfulWeb服务中的JavaEE应用程序。该WS负责接收一些请求并使用XMLs进行应答。有用于存储的服务和用于捕获MySQL数据库信息的服务。 该系统使用JAX-WS和JAX-B等API以及用于数据持久性的Hibernate框架完成 问题 当我直接或通过WS的服务更新、删除或插入数据库中的任何内容,并尝试通过服务查看结果时,除非重新启动WS,否则差异不会出现 可能性 我相信这是关于Hibernate缓存的,但我没有找到任何可以帮助我修复它的东西 有人已经有这个问题了吗

导言

我有一个包含在RESTfulWeb服务中的JavaEE应用程序。该WS负责接收一些请求并使用XMLs进行应答。有用于存储的服务和用于捕获MySQL数据库信息的服务。
该系统使用JAX-WS和JAX-B等API以及用于数据持久性的Hibernate框架完成

问题

当我直接或通过WS的服务更新、删除或插入数据库中的任何内容,并尝试通过服务查看结果时,除非重新启动WS,否则差异不会出现

可能性

我相信这是关于Hibernate缓存的,但我没有找到任何可以帮助我修复它的东西

有人已经有这个问题了吗?有什么想法吗

hibernate.cfg.xml:

<?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>
类别:DAOSource,使用上面使用的find方法:

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();
        }
    }
}
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;
    }

}
编辑:

调用flush()和clear()方法的DAOGenerics类

公共抽象类dao泛型{
非公开最后会议;
公共仿制药()
{
s=HibernateSessionFactory.getSession();
} 
公共文摘K客车(G obj);
公共摘要列表buscarTodos();
公共布尔插入(K obj){
试一试{
s、 冲洗();
s、 清除();
s、 getTransaction().begin();
s、 保存更新(obj);
s、 getTransaction().commit();
s、 close();
返回true;
}
捕获(休眠异常错误){
System.out.println(erro.getMessage());
s、 冲洗();
s、 清除();
s、 getTransaction().rollback();
s、 close();
返回false;
}
}
公共无效阿帕加(K obj){
试一试{
阿帕加(obj,s);
}最后{
s、 冲洗();
s、 清除();
s、 close();
}
}
公开无效阿帕加(K obj,会话s){
试一试{
s、 冲洗();
s、 清除();
s、 getTransaction().begin();
s、 删除(obj);
s、 getTransaction().commit();
}
捕获(休眠异常错误){
系统输出打印项次(erro);
s、 冲洗();
s、 清除();
s、 getTransaction().rollback();
}最后{
s、 close();
}
}
}

是的,如果您更改了hibernate“视图”之外的内容,hibernate缓存不会意识到这一点。So 2选项:

  • 使用hibernate进行删除/更新等:这将确保hibernate保持同步,并且性能与现在相同
  • 使用清除会话或使用无状态会话:请参阅以了解有关该会话的更多详细信息

我已经在hibernate中使用了deletes/updates,但这并不能首先解决问题,因为同样的问题也会发生,而且直接在DB上更改内容以进行测试是正常的。我的DAO类上已经有了flush方法,但问题仍然存在。我将编辑显示刷新调用的帖子。刷新用于写入,清除为:再见缓存。你能测试清除吗?不幸的是,我测试了,但没有工作,我用testFlush编辑了我的问题&清除不应该在事务中:你在提交之前清空了你的查询缓存。你能把它移到交易之外吗?完成了,但还是没有。
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;
    }

}
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();
        }
    }


}