Hi,
ich versuche gerade herauszufinden, wie ich denn eine Map<String,String> sinnvoll persistieren kann. Der Key ist dabei recht klein (<= 255 Zeichen), die Values können unter Umständen mehrere KB gross werden.
Mein momentaner Ansatz mit Hilfe von Hibernate Annotations sieht so aus:
Code:
@CollectionOfElements
@MapKey(columns=@Column(nullable=false,name="key"))
@Column(length=1024*1024,name="value")
private Map<String, String> headers;
Das generierte SQL sieht dann folgendermaßen aus:
Code:
create table RawPage_headers (
RawPage_id bigint not null,
value varchar(1048576),
key varchar(255) not null,
primary key (RawPage_id, key)
);
Bei der Auführung dieses Statements meint die DB2-Datenbank folgendes:
SQL0604N Das Attribut 'Length', 'Precision' oder 'Scale' für die Spalte, den
einzigartigen Datentyp, den strukturierten Typ, den Feldgruppentyp oder das Attribut eines strukturierten Typs, einer Routine, eines Umsetzungszieltyps, einer Typenzuordnung oder globalen Variablen "varchar(1048576)" ist ungültig. SQLSTATE=42611Das verstehe ich so, dass ein varchar einfach nicht so gross sein darf.
Mein nächster Versuch war es, den Typ des Values zu ändern. Sowohl @Lob als auch @Type(type="text") führen zu folgendem SQL:
Code:
create table RawPage_headers (
RawPage_id bigint not null,
value clob(1048576),
key clob(255) not null,
primary key (RawPage_id, key)
);
Das sieht zwar schon besser aus, führt dann aber zu Problemen beim Index:
SQL0350N Die Spalte "KEY" des Typs LOB, LONG VARCHAR, DATALINK, XML oder des strukturierten Typs kann nicht in einem Index, einem Schlüssel, einer eindeutigen Integritätsbedingung, einer funktionalen Abhängigkeit, einer generierten Spalte oder einer deklarierten temporären Tabelle verwendet werden. SQLSTATE=42962Gibt es also eine Möglichkeit, den Key als varchar zu belassen, während der Wert ein clob ist?
Ich habe nach Dinge wie @KeyType oder @MapKey(columns=@Column(nullable=false,name="key"
,type="irgendwas"))
gesucht, finde dazu aber leider nichts.
Vielen Dank schonmal fürs Lesen!
Hier noch weitere Infos zur verwendeten Software:
Hibernate version: 3.2
Mapping documents: in Annotations, Version 3.3.1 CR1
Code between sessionFactory.openSession() and session.close(): Problem tritt schon vorher auf
Full stack trace of any exception that occurs: -
Name and version of the database you are using: IBM DB2 Express-C 9.5.0
The generated SQL (show_sql=true): siehe oben
Debug level Hibernate log excerpt:Code:
[hibernatetool] 17:06:21,962 main INFO EntityBinder:424 - Bind entity testpackage.RawPage on table RawPage
[hibernatetool] 17:06:21,962 main DEBUG AnnotationBinder:1022 - Processing testpackage.RawPage property annotation
[hibernatetool] 17:06:21,978 main DEBUG AnnotationBinder:1022 - Processing testpackage.RawPage field annotation
[hibernatetool] 17:06:22,009 main DEBUG AnnotationBinder:1134 - Processing annotations of testpackage.RawPage.id
[hibernatetool] 17:06:22,009 main DEBUG Ejb3Column:161 - Binding column id unique false
[hibernatetool] 17:06:22,009 main DEBUG AnnotationBinder:1259 - id is an id
[hibernatetool] 17:06:22,009 main DEBUG SimpleValueBinder:220 - building SimpleValue for id
[hibernatetool] 17:06:22,009 main DEBUG PropertyBinder:129 - Building property id
[hibernatetool] 17:06:22,009 main DEBUG PropertyBinder:182 - Cascading id with null
[hibernatetool] 17:06:22,009 main DEBUG AnnotationBinder:1296 - Bind @Id on id
[hibernatetool] 17:06:22,009 main DEBUG AnnotationBinder:1134 - Processing annotations of testpackage.RawPage.content
[hibernatetool] 17:06:22,009 main DEBUG Ejb3Column:161 - Binding column content unique false
[hibernatetool] 17:06:22,009 main DEBUG PropertyBinder:107 - binding property content with lazy=false
[hibernatetool] 17:06:22,009 main DEBUG SimpleValueBinder:220 - building SimpleValue for content
[hibernatetool] 17:06:22,025 main DEBUG PropertyBinder:129 - Building property content
[hibernatetool] 17:06:22,025 main DEBUG PropertyBinder:182 - Cascading content with null
[hibernatetool] 17:06:22,025 main DEBUG AnnotationBinder:1134 - Processing annotations of testpackage.RawPage.headers
[hibernatetool] 17:06:22,025 main DEBUG Ejb3Column:161 - Binding column value unique false
[hibernatetool] 17:06:22,025 main DEBUG Ejb3Column:161 - Binding column null unique false
[hibernatetool] 17:06:22,025 main DEBUG Ejb3Column:161 - Binding column null unique false
[hibernatetool] 17:06:22,041 main DEBUG Ejb3Column:161 - Binding column value unique false
[hibernatetool] 17:06:22,041 main DEBUG Ejb3Column:161 - Binding column key unique false
[hibernatetool] 17:06:22,041 main DEBUG Ejb3Column:161 - Binding column null unique false
[hibernatetool] 17:06:22,056 main DEBUG Ejb3Column:161 - Binding column null unique false
[hibernatetool] 17:06:22,056 main DEBUG Ejb3Column:161 - Binding column null unique false
[hibernatetool] 17:06:22,056 main DEBUG CollectionBinder:290 - Collection role: testpackage.RawPage.headers
[hibernatetool] 17:06:22,056 main DEBUG PropertyBinder:129 - Building property headers
[hibernatetool] 17:06:22,056 main DEBUG PropertyBinder:182 - Cascading headers with null