昨天打算把正在开发系统的数据库从mysql切换到Oracle,为了能跨数据库,打算对主键生成策略稍作修改,对实体注释修改如下:@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator="itsc_seq_gen")
@SequenceGenerator(name="itsc_seq_gen", sequenceName="itsc_id_sequence")
@Column(name = "user_id")
private Integer userId;这种方式可以适应多种数据库,同时新建一个sequence,系统启动OK,从日志中可以知道实体映射没有问题。进入登陆界面,输入用户名和密码,系统最终调用DAO接口,是一个泛型接口: public T findByUniqueKey(String keyName, Serializable key) {
        //log.debug("read instance by uniquekey - " + keyName + ": " + key);
        try {
            //System.out.println("Aaron: the entity class is :" + this.entityClass);
                DetachedCriteria detachedCriteria = DetachedCriteria.forClass(this.entityClass);
            // log.debug("this.objectClass:" + this.objectClass);
            detachedCriteria = detachedCriteria.add(Expression.eq(keyName, key));
            detachedCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
            List<T> list = this.getHibernateTemplate().findByCriteria(
                    detachedCriteria);            // log.debug("list:" + list);
            if (list.size() == 0) {
                //log.error("not found!");
                return null;
            } else if (list.size() > 1) {
                throw new RuntimeException("RuntimeException:NotUniqueKey");
            }
            else {
                return list.get(0);
            }
        } catch (RuntimeException e) {
            //log.error("readByUniqueKey failed", e);
            throw e;
        }
    }结果当调用this.getHibernateTemplate().findByCriteria时,发现明明数据库中有数据,接口返回却为空。奇怪的是在数据库中运行Hibernate产生的SQL代码,发现可以查询得到一行数据。不知道大家有没有碰到这样的问题,是不是findByCriteria与oracle之间有什么问题?

解决方案 »

  1.   

    自己顶一下,难道是getHibernateTemplate().findByCriteria的问题?
      

  2.   

    到没有考虑过是否是驱动的问题,我用的是oracle xe版本中自带的ojdbc14.jar
      

  3.   

    问题发现了,原来是我手工创建原始数据的时候,数据库约束有点问题。现在这个问题解决了,查询可以了,但是当Hibernate插入数据时,并没有利用sequence产生ID,发现插入时userId是null,插入失败了。把strategy = GenerationType.AUTO改成strategy = GenerationType.SEQUENCE,问题更严重,系统启动时,居然提示org.hibernate.MappingException: Dialect does not support sequences。怎么可能我用的是org.hibernate.dialect.OracleDialect,怎么可能不支持sequence,晕了!
      

  4.   

    Hibernate 最忌讳数据库关系了