如何告诉我的数据库hibernate而不是其他应用程序进行了一些更改?

时间:2015-08-19 13:32:48

标签: java spring oracle hibernate

我是处理hibernate的新手,我已经得到了这个。 我使用Oracle db和Hibernate + Maven + Netbeans。我的目的是只能使用我的授权应用程序对我的数据库进行更改。不应该从SQL控制台或其他程序进行更改。为此,我在我的数据库中创建了一个表:

CREATE TABLE DATA(
   name  char(30),
   day   integer,
   month integer,
   year  integer );

这样的触发器会限制对我的数据库的任何访问:

  CREATE OR REPLACE TRIGGER tri_block
     BEFORE INSERT OR UPDATE OR DELETE ON data
    BEGIN
       IF  TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) < 12
           OR TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) >= 12
            OR TO_CHAR(SYSDATE,'dy') in ('sun','sat') THEN 
    RAISE_APPLICATION_ERROR (-20000, 'changes can not be made');
    END IF;
   END;

这是我的HibernateUtil.java:

 package com.scooby.util;

    import com.scooby.DATA;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new AnnotationConfiguration().configure()
                                .addAnnotatedClass(DATA.class).buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        // Close caches and connection pools
        getSessionFactory().close();
    }

  }

我听说过有关ORACLE上下文和hibernate会话的一些内容。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

触发器可能不是防止未经授权的写访问的好方法。标准解决方案是为您的应用程序创建新用户,然后向所有用户授予/撤消所需的Oracle权限,以确保只允许您的应用程序写入某些表。

如果您对此解决方案不满意,则会出现sys_context solution,其绝对是安全性,而另一个是。它提供了更广泛的审计功能,但在数据库方面也需要更多的工作,以及从应用程序调用存储过程。