Hallo, ich benutze die library active jdbc von http://javalite.io als ORM. Meine Models erben entsprechend von Model haben hier direkten Zugriff auf die Datenbank wie z.B. setString(String attributeName, Object value).
Allerdings gefällt mir hieran nicht, dass ich mich zu sehr an die Library binde. Theoretisch soll es ja so entwickelt werden, dass man die Datenbank austauscht und dann "nur" die Interfaces neu implementieren muss. Deshalb habe ich versucht nur über in einem Interface definierten Umfang von Funktionen auf die Models zuzugreifen:
Zu beachten ist, dass saveIt (durch geschickte(?) Wahl gleichen namens wie in activejdbc.Model) hier nicht implementiert werden muss.
Außerdem habe ich eine Repository Klasse eingeführt, in der gängige Funktionen implementiert sind wie findById.
Probleme:
1.
Wie verhindere ich, dass ein Entwickler im Projekt statt Funktionen aus dem Interface zu benutzen einfach
benutzt. Also direkt ein Model benutzt, das eng an activejdbc.Model gekoppelt ist und somit eine künftige Änderung der Datenbank erschweren würde. Oder besser: kann ich Recipe hinter dem Interface verstecken, damit die falsche Benutzung gar nicht erst möglich wird?
2. Ist es korrekt das nur über Interfaces zu machen oder benötige ich eine weitere Model-Klasse, die keine Abhängigkeiten zu activejdbc.Model hat?
Das ist das erste Mal, dass ich eine Library benutzen möchte ohne mich an sie binden zu müssen - fällt jemandem etwas auf oder hat jemand Verbesserungsvorschläge? Kennt jemand ein Projekt das die Models so abstrahiert hat, dass es mit verschiedenen Datenbanken funktioniert?
Ich habe ettliche Enties aus der Datenbank zu denen ich analog vorgehen muss. Das ist ziemlich viel Overhead - ich würde es gern mit einer Entity richtig machen und die anderen nachziehen.
Allerdings gefällt mir hieran nicht, dass ich mich zu sehr an die Library binde. Theoretisch soll es ja so entwickelt werden, dass man die Datenbank austauscht und dann "nur" die Interfaces neu implementieren muss. Deshalb habe ich versucht nur über in einem Interface definierten Umfang von Funktionen auf die Models zuzugreifen:
Zu beachten ist, dass saveIt (durch geschickte(?) Wahl gleichen namens wie in activejdbc.Model) hier nicht implementiert werden muss.
Java:
public interface IRecipe {
String getTitle();
void setTitle(String title);
boolean saveIt();
}
Java:
import org.javalite.activejdbc.Model;
import org.javalite.activejdbc.annotations.Table;
@Table("recipe")
public class Recipe extends Model implements IRecipe {
static {
validatePresenceOf("title");
}
public void setTitle(String title){
set("title", title);
}
public String getTitle() {
return getString("title");
}
}
Java:
import java.util.List;
import java.util.Optional;
public interface IRecipeRepository {
List<IRecipe> getRecipes();
Optional<IRecipe> getRecipeById(long id );
}
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class RecipeRepository implements IRecipeRepository {
@Override
public List<IRecipe> getRecipes() {
List<IRecipe> list= new ArrayList<>();
list.addAll(Recipe.findAll());
return list;
}
@Override
public Optional<IRecipe> getRecipeById( long id ) {
IRecipe result = Recipe.findById( id );
return Optional.ofNullable(result);
}
}
1.
Java:
IRecipe recipe = new Recipe();
Java:
Recipe recipe = new Recipe();
2. Ist es korrekt das nur über Interfaces zu machen oder benötige ich eine weitere Model-Klasse, die keine Abhängigkeiten zu activejdbc.Model hat?
Das ist das erste Mal, dass ich eine Library benutzen möchte ohne mich an sie binden zu müssen - fällt jemandem etwas auf oder hat jemand Verbesserungsvorschläge? Kennt jemand ein Projekt das die Models so abstrahiert hat, dass es mit verschiedenen Datenbanken funktioniert?
Ich habe ettliche Enties aus der Datenbank zu denen ich analog vorgehen muss. Das ist ziemlich viel Overhead - ich würde es gern mit einer Entity richtig machen und die anderen nachziehen.
Zuletzt bearbeitet: