java 多次添加SQL字符串:表名

mi7gmzs6  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(126)

我正在使用hibernate-maven-plugin引导一个数据库,使用它在执行它的maven模块中扫描的模型。
不幸的是,当hibernate抛出以下命令时,它会停止:

org.hibernate.tool.schema.spi.SchemaManagementException: SQL strings added more than once for: reference_data_source.UK-UK_9ec6wdvyj3mjagiptcnrq2txv
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.checkExportIdentifier(SchemaCreatorImpl.java:299)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:255)
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:128)
at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:199)

因此,我有两个持久性单元,两个单元中都有一些表。Hibernate似乎将其解释为相同的表,所以当它试图存储相同的索引时,但对于另一个模式,它会认为它是重复的。代码为here
我不知道该怎么做,不管怎样,配置hibernate hbm2 ddl来跟踪这些不同的持久性单元?
这是hibernate-maven-plugin的配置:

<plugin>
    <groupId>de.juplo</groupId>
    <artifactId>hibernate-maven-plugin</artifactId>
    <version>2.0.0</version>
    <configuration>
        <detail>true</detail>
        <persistenceUnit>mainPersistenceUnit</persistenceUnit>
        <driver>com.mysql.jdbc.Driver</driver>
        <dialect>org.hibernate.dialect.MySQL5Dialect</dialect>
        <force>true</force>
        <url><![CDATA[jdbc:mysql://localhost/auto_bootstrap_schema]]></url>
        <username>user</username>
        <password>pass</password>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
    </dependencies>
</plugin>
svmlkihl

svmlkihl1#

我也有同样的问题。在我的例子中,原因是我有三个以相同前缀名称开头的实体,并且每个实体都有一个OneToMany关系:

Person
PersonCard
PersonCardLayout

将我的模型重命名为这个解决了我的问题:

Person
Card
Layout

这似乎是Hibernate中的一个bug。

o7jaxewo

o7jaxewo2#

我也有同样的问题,看起来像一个bug:org.hibernate.mapping.UniqueKey#getExportIdentifier

@Override
public String getExportIdentifier() {
    return StringHelper.qualify( getTable().getName(), "UK-" + getName() );
}

因为标识符仅从表名而没有表的模式/目录构建。
因此,如果您必须使用相同表名但不同模式的实体,并且在这些实体中有两个名称相同且“unique = true”的属性,您将陷入错误。

t9aqgxwy

t9aqgxwy3#

另一个解决方案是使用@Table。
例如:
@Table(name=“PERSON”)
当我有两个表示两个实体(@Entity)的类时,就发生了这种情况:
public class User {...}
public class UserRoles {...}
我通过如下指定表名来修复此错误:

@Entity
@Table(name="USER")
public class User {...}

并且:

@Table(name="USER_ROLES")
@Entity
public class UserRoles {...}
nfs0ujit

nfs0ujit4#

不确定这是否与我遇到的相同,但我有相同的错误问题标记为@Entity annotation的基类:更改为@MappedSuperclass删除了错误。
祝你好运,雷

相关问题