为什么在使用Hibernate和Oracle 10g方言时,JPA会创建一个名为hibernate_sequence的序列?

8

我的所有实体都使用这种类型的@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序列总是被创建。为什么会这样?我该如何避免?
我正在使用带有Hibernate 3和Oracle 10g方言的JPA1。

1
你确定没有任何带有 @GeneratedValue() 注释的 @Entity 的 id 属性没有声明任何属性吗? - Arthur Ronald
3个回答

10

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。也许您应该进行一次小的调试会话。


-3
我怀疑是因为我正在使用Hibernate Envers,因为我已经仔细检查过我的实体,所有实体都有正确的@Id映射。

5
那么它的解决方案是什么? - cachiama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接