X
Xenya
Gast
Hallo,
ich habe ein Programm das mit vielen Modulen aufgebaut ist. Da jedes Modul auf die gleiche Weise aufgebaut ist und sich vieles ähnelt, gibt es eine abstrakte Klasse, die alles was möglich ist bereits umsetzt.
Da oft neue Module hinzukommen ist dies ziemlich genial, da sich der Aufwand für neue somit gering hält.
Jedes dieser Module speichert seine Inhalte per Hibernate in die Datenbank. Damit auch hier der Aufwand möglichst gering bleibt, gibt es für die Entities auch eine abstrakte Klasse, die durch das @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) für jede abgeleitete Entity eine eigene Tabelle macht.
In der abstrakten Entity ist z.B. auch ein Date-Feld für ein Aktions-Zeitpunkt definiert.
Nun ist es ab und an nötig, dass bei allen Datensätzen jedes Moduls ein bestimmtes Datum gespeichert wird, wenn bis jetzt null darin steht.
Um genau diese Umsetzung geht es mir nun. Da überall der gleiche Schritt nötig ist, würde ich es gerne so machen, dass komplett alles in der abstrakten Modul-Klasse geschieht und man sich bei neuen Modulen rein gar nicht drum kümmern muss.
Erst mal zu den Möglichkeiten, wie es bei Hibernate geht:
Ich könnte alle Datensätze laden, bei denen actionDate == null ist, dann setActionDate(newDate) machen und ein update darauf ausführen. Das ist allerdings doch sehr umständlich und auch ineffizient, da viele Anfragen an das Datenbank geschickt werden. Darüber hinaus brauche ich die Objekte danach nicht mehr.
Eine Methode über die Criterias kenne ich nicht, die nur ein Update machen.
Also gibt es nur noch die Alternative, es über ein SQL-Statement zu machen. Das funktioniert auch wunderbar:
Das große Problem ist nun aber, dass ich den Tabellennamen, wo bei dem Beispiel "ModulTable" steht, angeben muss.
Das heißt, ich müsste mir den Namen der Entity zum Beispiel im Konstruktor übergeben lassen und kann das ganze Problem doch nicht kapseln, so dass der Programmierer von neuen Modulen sich damit beschäftigen muss. Viel besser würde es mir gefallen, wenn auch dies noch automatisch geht.
Die Modul-Klassen bekommen alle die Entity als Generic mit:
Kann ich über dieses E vielleicht zur Laufzeit den Tabellen-Namen herausbekommen?
Fällt euch etwas ein, wie ich dieses Problem so lösen könnte, dass bei neuen Modulen nichtmal der Entity-Name mitgegeben werden muss?
Vielen lieben Dank für eure Hilfe.
ich habe ein Programm das mit vielen Modulen aufgebaut ist. Da jedes Modul auf die gleiche Weise aufgebaut ist und sich vieles ähnelt, gibt es eine abstrakte Klasse, die alles was möglich ist bereits umsetzt.
Da oft neue Module hinzukommen ist dies ziemlich genial, da sich der Aufwand für neue somit gering hält.
Jedes dieser Module speichert seine Inhalte per Hibernate in die Datenbank. Damit auch hier der Aufwand möglichst gering bleibt, gibt es für die Entities auch eine abstrakte Klasse, die durch das @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) für jede abgeleitete Entity eine eigene Tabelle macht.
In der abstrakten Entity ist z.B. auch ein Date-Feld für ein Aktions-Zeitpunkt definiert.
Nun ist es ab und an nötig, dass bei allen Datensätzen jedes Moduls ein bestimmtes Datum gespeichert wird, wenn bis jetzt null darin steht.
Um genau diese Umsetzung geht es mir nun. Da überall der gleiche Schritt nötig ist, würde ich es gerne so machen, dass komplett alles in der abstrakten Modul-Klasse geschieht und man sich bei neuen Modulen rein gar nicht drum kümmern muss.
Erst mal zu den Möglichkeiten, wie es bei Hibernate geht:
Ich könnte alle Datensätze laden, bei denen actionDate == null ist, dann setActionDate(newDate) machen und ein update darauf ausführen. Das ist allerdings doch sehr umständlich und auch ineffizient, da viele Anfragen an das Datenbank geschickt werden. Darüber hinaus brauche ich die Objekte danach nicht mehr.
Eine Methode über die Criterias kenne ich nicht, die nur ein Update machen.
Also gibt es nur noch die Alternative, es über ein SQL-Statement zu machen. Das funktioniert auch wunderbar:
Java:
Transaction transaction = session.beginTransaction();
SQLQuery query = session.createSQLQuery("UPDATE ModulTable " +
"Set actionDate = ? " +
"WHERE actionDate IS NULL");
query.setDate(0, newDate);
query.executeUpdate();
transaction.commit();
Das große Problem ist nun aber, dass ich den Tabellennamen, wo bei dem Beispiel "ModulTable" steht, angeben muss.
Das heißt, ich müsste mir den Namen der Entity zum Beispiel im Konstruktor übergeben lassen und kann das ganze Problem doch nicht kapseln, so dass der Programmierer von neuen Modulen sich damit beschäftigen muss. Viel besser würde es mir gefallen, wenn auch dies noch automatisch geht.
Die Modul-Klassen bekommen alle die Entity als Generic mit:
Java:
class AbstractModul<E extends AbstractModulEntity>
Fällt euch etwas ein, wie ich dieses Problem so lösen könnte, dass bei neuen Modulen nichtmal der Entity-Name mitgegeben werden muss?
Vielen lieben Dank für eure Hilfe.