Hibernate自定义ID生成器在部署到weblogic时出现异常

时间:2018-01-23 06:47:41

标签: java oracle hibernate jpa weblogic

我最近正在完成一项任务,我正在重构一个旧的Web项目。首先,我尝试在开始重构之前在我的本地weblogic实例上运行该项目。

当我尝试部署应用程序时,我得到了一个hibernate异常,如下所示==>

Caused By: org.hibernate.AnnotationException: Unknown Id.generator: unique-id
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:428)
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1901)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1279)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546)
Truncated. see log file for complete stacktrace

上面的例外意味着它无法找到名为“unique-id”的id生成器。然后我深入研究代码,看到实体中的id字段是字符串。并且有一个自定义ID生成器类正在实现hibernate IdentifierGenerator类,它调用db函数来为每次调用时生成字母数字id。下面是实体类中的一段代码,它定义了id生成的类型。

  @Id
  @Column(name = "ID", nullable = false, length = 18)
  @GenericGenerator(name = "unique-id", strategy = "com.common.entity.RowIdGenerator")
  @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "unique-id")
  private String id;

这是用于生成字母数字id的RowIdGenerator类。

 public class RowIdGenerator implements IdentifierGenerator
{
  private final static String SQL_TEXT = "SELECT TCC.F_ROW_ID_GEN FROM DUAL";

  @Override
  public Serializable generate(SessionImplementor sessionImplemetor, Object object) throws HibernateException
  {
    return this.getNextNumber(sessionImplemetor);
  }

  private String getNextNumber(SessionImplementor session)
  {
    try
    {
      ResultSet rs = null;
      PreparedStatement statement = null;
      try
      {
        statement = session.getBatcher().prepareSelectStatement(SQL_TEXT);
        rs = statement.executeQuery();
        String nextValue = null;
        if (rs.next())
          nextValue = rs.getString(1);
        if (nextValue == null)
          throw new HibernateException("is is null.");
        return nextValue;
      } 
      finally
      {
        if (rs != null)
          rs.close();
        if (statement != null)
          session.getBatcher().closeStatement(statement);
      }
    } catch (SQLException sqle)
    {
      throw JDBCExceptionHelper.convert(session.getFactory().getSQLExceptionConverter(), sqle, "could not fetch initial value for increment generator", SQL_TEXT);
    }
  }

}

可能导致此错误的原因是什么?我看到名为“unique-id”的生成器已定义并注释。据我所知,代码中没有错误,可能是因为我的本地weblogic实例的配置,但任何评论和建议都会受到赞赏。

问候

1 个答案:

答案 0 :(得分:0)

你可以只自动生成数字作为ids.hibernate不支持其他类型的字符串生成