Meine Frage: ich schreib gerade einen Testcase. Im TestCase möchte ich die Klasse Event gegen eine inmemory hsql db testen. Bevor der Testcase startet habe ich in der mit @BeforeTransaction (aus Spring) annotierten setup Methode folgende SQL Code laufen um die Tabellen zu füllen:
Dabei fliegt mir eine
Exception um die Ohren.
Kann ich nun in Tabellen, die über @ElementCollection angelegt wurden eigentlich vorab per SQL INSERTS füllen? (Ich weiß ja nicht wie genau Hibernate die Tabelle anlegt, welche Contraints beachtet werden müsse, etc.)
Hier also der Code
1. Klasse Event mit dem I18Strings Object, das embedded werden soll.
2. Die Klasse I18Strings. Im Prinzip verwaltet sie nur eine Collection von I18String Objekten.
3. Die I18String Klasse. Ist im Prinzip nur ein String mit einer Locale
Hier die Exception...
SQL:
INSERT INTO event (id, creationtimestamp.....);
INSERT INTO I18NSTRING (id, I18NSSTRING_LANGUAGE_CODE, I18NSSTRING_CONTENT) values (1, 'de', 'EVENT 1 (TEST)');
INSERT INTO I18NSTRING (id, I18NSSTRING_LANGUAGE_CODE, I18NSSTRING_CONTENT) values (1, 'en', 'EVENT 2 (TEST)');
Dabei fliegt mir eine
Code:
org.hsqldb.HsqlException: integrity constraint violation: foreign key no parent; FK73DAB3AF4E0EC202 table: I18NSTRING
Exception um die Ohren.
Kann ich nun in Tabellen, die über @ElementCollection angelegt wurden eigentlich vorab per SQL INSERTS füllen? (Ich weiß ja nicht wie genau Hibernate die Tabelle anlegt, welche Contraints beachtet werden müsse, etc.)
Hier also der Code
1. Klasse Event mit dem I18Strings Object, das embedded werden soll.
Java:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Event extends AbstractPersistenceEntity {
@Embedded
private I18NStrings eventTitles = new I18NStrings();
}
2. Die Klasse I18Strings. Im Prinzip verwaltet sie nur eine Collection von I18String Objekten.
Java:
@Embeddable
public class I18NStrings {
// [url=http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection]Java Persistence/ElementCollection - Wikibooks, open books for an open world[/url]
@ElementCollection
@CollectionTable(
name="I18NSTRING",
joinColumns=@JoinColumn(name="id")
)
@Column(name="I18NSTRING")
private Set<I18NString> I18NStrings = new HashSet<I18NString>();
}
3. Die I18String Klasse. Ist im Prinzip nur ein String mit einer Locale
Java:
@Embeddable
public class I18NString {
@Column(name = "I18NSSTRING_CONTENT", nullable = false)
private String string;
@Column(name = "I18NSSTRING_LANGUAGE_CODE", nullable = false)
private String language;
....
}
Hier die Exception...
Java:
org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [
INSERT INTO I18NSTRING (id, I18NSSTRING_LANGUAGE_CODE, I18NSSTRING_CONTENT) values (1, 'de', 'Messe Hannover (TEST)')]; integrity constraint violation: foreign key no parent; FK73DAB3AF4E0EC202 table: I18NSTRING; nested exception is java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no parent; FK73DAB3AF4E0EC202 table: I18NSTRING
....
at Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no parent; FK73DAB3AF4E0EC202 table: I18NSTRING
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Constraint.getException(Unknown Source)
at org.hsqldb.Constraint.checkInsert(Unknown Source)
at org.hsqldb.StatementDML.performIntegrityChecks(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
at org.hsqldb.StatementInsert.getResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 37 more