Veröffentlicht 5. Dezember 200816 j 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
5. Dezember 200816 j 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
5. Dezember 200816 j 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..?
5. Dezember 200816 j 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.
5. Dezember 200816 j 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?
5. Dezember 200816 j 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.
5. Dezember 200816 j 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.
5. Dezember 200816 j [...] 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ß
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.