chris84hh Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 Hallo, ich habe eine Applikation mit einer Datenbankanbindung und verschiedenen Klassen die die verschiedenen Objekte der Datenbank repräsentieren. Wenn ich nun ein Objekt speichern/aktualisieren will ist der Quellcode immer der gleiche und unterscheidet sich nur im Typ des Objekts was ich speichern will und der Klasse die das realisiert(DAO). Das sieht dann für eine Adresse so aus. private void doAddress(Address address, TOperationType op){ TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition()); switch(op){ case SAVE: getAddressDAO().save(address); break; case UPDATE: getAddressDAO().update(address); break; case DELETE: getAddressDAO().delete(address); break; } txManager.commit(status); } Diese Methode könnte ich nun für all meine 20 DB Objekte schreiben.. aber ich dachte mir vielleicht gehts auch anders. Gibt es ne Möglichkeit dass ich eine allgemeine Methode für alle Objekte der DB schreibe? Ich dachte mir ich kann vielleicht die Typen der Objekte mit übergeben weiß aber nicht wie und bin mit google.de auch nicht weiter gekommen. gruß chris Zitieren
kingofbrain Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 Servus, das Zauberwort heißt generics und geht seit Java 1.5. Es gibt ein ganz gutes Beispiel für ein generisches Hibernate DAO: http://www.hibernate.org/328.html Das kann man recht gut für andere Zwecke anpassen. Im Endeffekt sagst Du damit einer konkreten Klasse, dass sie von einer generischen Klasse erbt und damit die in der generischen Klasse noch generischen Methoden konret enthält. Peter Zitieren
chris84hh Geschrieben 5. Dezember 2008 Autor Geschrieben 5. Dezember 2008 ok.. danke ich gucks mir mal an.. die Seite is nur gerade irgendwie down. Ich dachte man kann das vielleicht auch ohne Vererbung lösen..? Zitieren
speedi Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 In Java stammen alle Klassen von Objekt ab. Du kannst also der Methode ein Object übergen (seit ?Java 1.6? kannst du da auch einen int direkt übergeben ohne den Umweg mit new Integer(deinInt)). Falls du Datentypen beim Speichern in die Datenbank unterschiedlich behandeln musst kannst du mit if(object instanceof String) abfragen ob dir beispielsweise ein String übergeben wurde. Zitieren
chris84hh Geschrieben 5. Dezember 2008 Autor Geschrieben 5. Dezember 2008 Ich weiß dass alle DAO-Objekte die ich in die Methode werfe ein Methode sav/delete/update haben. Wie kann ich die aufrufen ohne eine gemeinsame Klasse zu erstellen die diese Methoden implementiert? Zitieren
TDM Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 Warum schreibst du keine Interfaces? bzw. hab ichs in Javaprogrammen immer so gemacht, dass die Klassen selber ihre SQL-Statements zusammenfriemeln und dieses dann an die DB schicken. Zitieren
Dragon8 Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 Ich dachte man kann das vielleicht auch ohne Vererbung lösen..? Gerade Vererbung ist hier das Zauberwort womit das möglich wäre, um genauer zu sein, sind Interfaces dafür recht gut geeignet. Das wäre in deinem Fall zum Beispiel ein Interface, dass alle Klassen die Datenbankobjekte darstellen, implementieren. Wobei das Interface dann verlangt, dass alle Klassen die Methoden implementieren, die du für die Verarbeitung brauchst. Zitieren
kein-tee Geschrieben 5. Dezember 2008 Geschrieben 5. Dezember 2008 [...] Gibt es ne Möglichkeit dass ich eine allgemeine Methode für alle Objekte der DB schreibe? [...] Interessehalber geselle ich mich der Diskussion hinzu. Prinzipiell gäbe noch als Lösungsmöglichkeit Reflections. Kleines Beispiel (kein Anspruch auf Richtigkeit, Vollständikeit usw.): public class MethodReflection { public static class DefaultEntity { } public static class DefaultEntityDao { public void save(DefaultEntity defaultEntity) { } public void update(DefaultEntity defaultEntity) { } public void delete(DefaultEntity defaultEntity) { } } public DefaultEntityDao getDefaultEntityDAO() { return new DefaultEntityDao(); } public void doSomething(Object entity) throws [COLOR="Red"]SecurityException[/COLOR], [COLOR="#ff0000"]NoSuchMethodException[/COLOR], [COLOR="#ff0000"]IllegalArgumentException[/COLOR], [COLOR="#ff0000"]IllegalAccessException[/COLOR], [COLOR="#ff0000"]InvocationTargetException[/COLOR] { String daoMethodName = "get".concat(entity.getClass().getSimpleName()).concat("DAO"); Method daoMethod = MethodReflection.class.getMethod(daoMethodName, new Class[] {}); Object dao = daoMethod.invoke(this, new Object[] { }); Method saveMethod = dao.getClass().getMethod("save", entity.getClass()); Method updateMethod = dao.getClass().getMethod("update", entity.getClass()); Method deleteMethod = dao.getClass().getMethod("delete", entity.getClass()); saveMethod.invoke(dao, new Object[] { entity } ); updateMethod.invoke(dao, new Object[] { entity } ); deleteMethod.invoke(dao, new Object[] { entity } ); } } Wie sinnvoll eine solche Lösung ist, bleibt hinsichtlich verschiedener Kriterien (Lesbarkeit, Naming Conventions, Sicherheit, Robustheit etc.) dahingestellt. Ich würde davon absehen. Persönlich nutze ich, wie bereits vorhergehend erwähnt, Generics und Interfaces. Gruß Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.