Échec: alter table XXX drop constraint YYY dans Hibernate/JPA/HSQLDB autonome
Je suis en train de lancer certains Hibernate/JPA, exemples à l'aide d'une mémoire HSQL DB. Le message d'erreur que j'obtiens est le suivant:
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
La classe correspondante est:
@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
}
La intégrable est:
@Embeddable
public class AnEmbeddable implements Serializable {
private String s;
public AnEmbeddable() { }
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
Mon 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>
Je suis sur Hibernate 4.1.5.Final
et HSQLDB 2.2.8
.
Personne ne sait quelle est l'origine de ce problème et comment le résoudre?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ignorer ces erreurs. Combinaison de
create-drop
et de la base de données en mémoire produit pour chaque objet de base de données, il essaie de drop. La raison étant qu'il n'est pas des objets de base de données à supprimer - DROP sont exécutées sur la base de données vide.Aussi avec la normale de la base de données permanente de telles erreurs ne viennent, parce qu'Hibernate ne pas comprendre avant d'exécuter les instructions DROP n'est ajouté objet existe dans la base de données ou est-il de nouveau.
4.3.0.Final
et je vois encore "l'erreur", ou dans mon cas, peut-être un peu différent:HHH000389: Unsuccessful: alter table ... drop constraint FK_g1uebn6mqk9qiaw45vnacmyo2 if exists
etTable "..." not found; SQL statement: ...
Cette solution a fonctionné pour moi, par opposition à l'autre solution qui est donnée. Apparemment, le kilométrage varie.
C'était mon erreur exact:
C'est ma solution, en remplaçant le H2 dialecte:
La Solution @Sander fournis ci-dessus fonctionne pour MYSQL aussi. Juste étendre MySQL5InnoDBDialect plutôt comme ci-dessous:
Puis dans votre source de données fichier modifiez la ligne suivante:
à
Juste mis
dbCreate="update"
, et les erreurs disparaissent immédiatement.Voir: https://stackoverflow.com/a/31257468/715608
L'ennuyeux messages d'erreur qui est devenu de plus odieux des traces de la pile au début de chaque test à l'aide d'une base de données en mémoire avec HSQLDB et hbm2ddl.auto=create-drop.
La réponse à une HSQLDB rapport de bug a suggéré l'utilisation de DROP TABLE ... CASCADE plutôt que de supprimer la CONTRAINTE S'il EXISTE. Malheureusement, le HSQLDB syntaxe de drop table est
DROP TABLE <table> [IF EXISTS] [RESTRICT | CASCADE];
Hibernate Dialecte ne fournit pas un mécanisme simple pour un Dialecte de spécifier CASCADE à la suite de la finale, S'il EXISTE une clause. J'ai écrit un bug pour cette limitation.Cependant, j'ai été en mesure de résoudre le problème par la création d'une coutume Dialecte comme suit: