为什么使用带有Oracle 10g方言的Hibernate使用JPA创建名为hibernate_sequence的序列?

时间:2010-06-17 01:04:41

标签: java hibernate orm jpa oracle10g

我的所有实体都使用此类@Id

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MYENTITY_SEQ")
@SequenceGenerator(name = "MYENTITY_SEQ", sequenceName = "MYENTITY_SEQ")
@Column(name = "MYENTITY", nullable = false)
private Long id;

@Id
@Column(name = "MYENTITY")

我发现始终创建名为hibernate_sequence的Oracle序列。为什么会这样?我怎么能避免这个?

我正在使用JPA1和Hibernate 3以及Oracle 10g方言。

3 个答案:

答案 0 :(得分:10)

HIBERNATE_SEQUENCE与REVINFO实体一起用于创建修订号。如果要使用不同的顺序,则应创建自定义修订实体。

帮助: http://docs.jboss.org/hibernate/envers/3.5/reference/en-US/html/revisionlog.html

答案 1 :(得分:4)

我在org.hibernate.id.SequenceGenerator中看到以下代码:

public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
    ObjectNameNormalizer normalizer = ( ObjectNameNormalizer ) params.get( IDENTIFIER_NORMALIZER );
    sequenceName = normalizer.normalizeIdentifierQuoting(
            PropertiesHelper.getString( SEQUENCE, params, "hibernate_sequence" )
    );
    parameters = params.getProperty( PARAMETERS );

    if ( sequenceName.indexOf( '.' ) < 0 ) {
        final String schemaName = normalizer.normalizeIdentifierQuoting( params.getProperty( SCHEMA ) );
        final String catalogName = normalizer.normalizeIdentifierQuoting( params.getProperty( CATALOG ) );
        sequenceName = Table.qualify(
                dialect.quote( catalogName ),
                dialect.quote( schemaName ),
                dialect.quote( sequenceName )
        );
    }
    else {
        // if already qualified there is not much we can do in a portable manner so we pass it
        // through and assume the user has set up the name correctly.
    }

    this.identifierType = type;
    sql = dialect.getSequenceNextValString( sequenceName );
}

PropertiesHelper.getString(String, Properties, String)的第三个参数是默认属性值。

所以我很想说,在某个地方,你有Id没有“正确”注释。也许你应该进行一些调试会议。

答案 2 :(得分:-3)

我怀疑是因为我正在使用Hibernate Envers,因为我已经对我的实体进行了双重检查,所有这些实体都有正确的@Id映射。