Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben
[...]

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ß

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...