不成功:alter table XXX在Hibernate/JPA/HSQLDB独立版中删除约束YYY

Jér*_*nge 41 java hibernate jpa hsqldb in-memory

我试图使用内存中的HSQL DB运行一些Hibernate/JPA示例.我得到的错误消息如下:

13:54:21,427 ERROR SchemaExport:425 - HHH000389: Unsuccessful: alter table ReferringItem_map drop constraint FK5D4A98E0361647B8
13:54:21,427 ERROR SchemaExport:426 - user lacks privilege or object not found: PUBLIC.REFERRINGITEM_MAP
13:54:21,427 ERROR SchemaExport:425 - HHH000389: Unsuccessful: alter table ReferringItem_myCollection drop constraint FK75BA3266361647B8
13:54:21,427 ERROR SchemaExport:426 - user lacks privilege or object not found: PUBLIC.REFERRINGITEM_MYCOLLECTION
13:54:21,428 ERROR SchemaExport:425 - HHH000389: Unsuccessful: alter table ReferringItem_myList drop constraint FK6D37AA66361647B8
13:54:21,428 ERROR SchemaExport:426 - user lacks privilege or object not found: PUBLIC.REFERRINGITEM_MYLIST
13:54:21,428 ERROR SchemaExport:425 - HHH000389: Unsuccessful: alter table ReferringItem_mySet drop constraint FK3512699A361647B8
13:54:21,429 ERROR SchemaExport:426 - user lacks privilege or object not found: PUBLIC.REFERRINGITEM_MYSET
Run Code Online (Sandbox Code Playgroud)

相应的类是:

@Entity
public class ReferringItem implements Serializable {

    @Id
    private long id;

    @ElementCollection
    private Collection<AnEmbeddable> myCollection
        = new ArrayList<AnEmbeddable>();

    @ElementCollection(fetch=FetchType.EAGER)
    private Set<Long> mySet = new HashSet<Long>();

    @ElementCollection(targetClass=String.class)
    private List myList = new ArrayList();

    @ElementCollection
    private Map<String,AnEmbeddable> map
        = new HashMap<String,AnEmbeddable>();

    public ReferringItem() { }

    // Setters & Getters

}
Run Code Online (Sandbox Code Playgroud)

可嵌入的是:

@Embeddable
public class AnEmbeddable implements Serializable {

    private String s;

    public AnEmbeddable() { }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">

    <persistence-unit name="JPA" transaction-type="RESOURCE_LOCAL">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>com.jverstry.jpa.AuthorizedTypes.AuthorizedTypes</class>
        <class>com.jverstry.jpa.AuthorizedTypes.OtherEntity</class>
        <class>com.jverstry.jpa.AuthorizedTypes.SomeEmbeddable</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:testdb"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>

    </persistence-unit>

</persistence>
Run Code Online (Sandbox Code Playgroud)

我在Hibernate 4.1.5.FinalHSQLDB 2.2.8.

有谁知道是什么导致了这个问题以及如何解决它?

Mik*_*unu 56

您可以忽略这些错误.create-drop内存数据库的组合为它尝试删除的每个数据库对象生成这些数据.原因是没有要删除的数据库对象 - DROP语句是针对空数据库执行的.

此外,对于普通的永久数据库,这样的错误确实会出现,因为Hibernate在执行DROP语句之前没有弄清楚数据库中是否存在添加的对象,或者是新的.

  • 问题是https://hibernate.onjira.com/browse/HHH-7002,我看到了与MySQL相同的行为,所以不仅仅是在内存数据库中. (8认同)
  • 我升级到“4.3.0.Final”,但仍然看到“该”错误,或者在我的情况下可能略有不同:“HHH000389:不成功:更改表...删除约束 FK_g1uebn6mqk9qiaw45vnacmyo2 如果存在”和“表” “...“ 未找到; SQL语句:...` (2认同)
  • 我使用HSQLDB 2.3.2和Hibernate 4.3.8,我仍然收到警告. (2认同)
  • “你可以忽略这些错误。” 每次你忽略一个错误,一只小熊猫就会死去......#truestory (2认同)

San*_*gen 28

这个解决方案对我有用,而不是给出的其他解决方案.里程数显然不同.

这是我的确切错误:

HHH000389: Unsuccessful: alter table ... drop constraint FK_g1uebn6mqk9qiaw45vnacmyo2 if exists
Table "..." not found; SQL statement: ...
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案,覆盖H2方言:

package com.totaalsoftware.incidentmanager;

import org.hibernate.dialect.H2Dialect;

/**
 * Workaround.
 * 
 * @see https://hibernate.atlassian.net/browse/hhh-7002
 * 
 */
public class ImprovedH2Dialect extends H2Dialect {
    @Override
    public String getDropSequenceString(String sequenceName) {
        // Adding the "if exists" clause to avoid warnings
        return "drop sequence if exists " + sequenceName;
    }

    @Override
    public boolean dropConstraints() {
        // We don't need to drop constraints before dropping tables, that just
        // leads to error messages about missing tables when we don't have a
        // schema in the database
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


Emm*_*ohn 12

上面提供的解决方案@Sander也适用于MYSQL.只需扩展MySQL5InnoDBDialect,如下所示:

import org.hibernate.dialect.MySQL5InnoDBDialect;

public class ImprovedMySQLDialect extends MySQL5InnoDBDialect {
    @Override
    public String getDropSequenceString(String sequenceName) {
        // Adding the "if exists" clause to avoid warnings
        return "drop sequence if exists " + sequenceName;
    }

    @Override
    public boolean dropConstraints() {
        // We don't need to drop constraints before dropping tables, that just leads to error
        // messages about missing tables when we don't have a schema in the database
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的数据源文件中更改以下行:

dialect = org.hibernate.dialect.MySQL5InnoDBDialect
Run Code Online (Sandbox Code Playgroud)

dialect = my.package.name.ImprovedMySQLDialect
Run Code Online (Sandbox Code Playgroud)


10G*_*per 12

只需设置dbCreate="update",错误就会立即消失.

请参阅:https://stackoverflow.com/a/31257468/715608