Architektur für JPA Hibernate Umstieg

looparda

Top Contributor
Hallo, ich habe ein OSS Projekt bei dem als ORM ActiveJDBC gewählt wurde. Das Programm parst Rezepte aus verschiedenen Quellen und legt diese in der Datenbank ab.
Die Datenbank wird ihrerseits von einer JavaFX GUI benutzt.
Ein Rezept hat recht viele Aggregationen zu anderen Objekten wie Kategorie, Quelle, Zutaten (welches wiederum Aggregationen von Einheit und Menge hat)

Während der Implementierungsphase traten Probleme mit der "Active Record" Architektur der Library auf. Eins davon:
- Ein Parser versucht eine Quelle zu parsen und baut dazu ein Rezept Objekt zusammen. Möchte man nun die Aggregation eines Kategorie zum Rezept bilden muss die Kategorie zuerst in der Datenbank gespeichert sein.
Gibt der Parser nun das Rezept an den Aufrufer zurück und dieser entscheidet, dass das Rezept unvollständig ist weil bspw. der Titel des Rezepts fehlt, befinden sich Objekte in der Datenbank die eigentlich noch gar nicht in der Datenbank sein sollten aber man durch den Active-Record Ansatz dazu gezwungen wurde.
Dies löste ich nun durch Trennung von Datenbankobjekten und POJO. D.h. Alle Objekte aus der Datenbank wurden zur Verwendung in der Applikationslogik und GUI erst in POJO gemappt. POJO, die in die Datenbank sollten wurden nun erst zu Datenbankobjekten gemappt. Das ist eine Heidenarbeit, da ich bei POJO, die persistiert werden sollen erst überprüfen musste ob die Aggregationen bereits persistiert sind, ob die Aggregation bisher nur auf Objektebene besteht (falls ja, Beziehung in Datenbank anlegen - natürlich auch hier weider erst das Aggregationsende persistieren, das wiederum Aggregate hat) und weitere Dinge. Das wurde sehr schnell sehr komplex und ich implementierte dort Persistierungsregeln, die mir mir die Library eigentlich abnehmen sollte.

Es hat sich also während der Implementierung herausgestellt, dass die Architektur der Datenbankanbindung unstimmig ist. Ich bin auf der Suche nach der richtigen Architektur und benötige dazu Hilfe.
Der Active Record Ansatz ist gestorben, wenn man POJO bzw. das DAO Pattern anwenden möchte. Zwangsläufig denke ich also über den Wechsel der Datenbank-Library nach und möchte gern JPA mit Hibernate einsetzen. Allerdings überfordert mich diese Library auch ein wenig, da ich nicht weiß in welche Ebene/Stelle das persistieren gehört - und das möglichst generisch mit GenericDAO Ansatz.

Eigentlich kann mir jeder helfen, der eine Datenbank mit Hibernate angebunden hat und denkt, dass es gut umgesetzt ist.
Würde mich auch durch andere OSS Projekte wühlen, falls ihr welche empfehlen könnt.
 

Tobse

Top Contributor
Zunächst: Ich verstehe das Problem nicht so recht; wenn eine Entität nicht in die DB soll, darf man es eben nicht über den DAO speichern. Es würde ja genügen, die Entitäten des Parsers alle erstmal zu sammeln, zu prüfen und dann erst die brauchbaren dem DAO zu übergeben. Aber ich kenne eure Architektur nicht, ich übersehe warhscheinlich einen wichtigen Aspekt.

Vielleicht gelingt es mir, dir das Konzept von Hibernate schnell zu erklären:

Die Herangehensweise von Hibernate nennt sich Unity of Work. Die Idee ist, dass die Entitäten auch völlig unabhängig von der DB funktionieren. Das erkennen von Änderungen und das persistieren übernimmt Hibernate komplett. Das einzige was man noch manuell tun muss, ist das Framework anzuweisen, welche Entities neu hinzugekommen sind und welche entfernt werden sollen.

Dadurch erreicht man folgendes:
  • Unit-Testbarkeit der Business-Logik (im Gegensatz zu Intergrationstests mit einem ADO-Ansatz)
  • man spart sich einen Haufen DB-Spezifischen Code
 

Dompteur

Top Contributor
...
- Ein Parser versucht eine Quelle zu parsen und baut dazu ein Rezept Objekt zusammen. Möchte man nun die Aggregation eines Kategorie zum Rezept bilden muss die Kategorie zuerst in der Datenbank gespeichert sein.
Gibt der Parser nun das Rezept an den Aufrufer zurück und dieser entscheidet, dass das Rezept unvollständig ist weil bspw. der Titel des Rezepts fehlt, befinden sich Objekte in der Datenbank die eigentlich noch gar nicht in der Datenbank sein sollten aber man durch den Active-Record Ansatz dazu gezwungen wurde.
Unterstützt ActiveJDBC keine Transaktionen ? Ich kenne die Library nicht, aber folgender Link http://javalite.io/transactions läßt es mich vermuten.
 

looparda

Top Contributor
Zunächst: Ich verstehe das Problem nicht so recht; wenn eine Entität nicht in die DB soll, muss ja sie ja auch nicht über das DAO speichern. Es würde ja genügen, die Entitäten des Parsers alle erstmal zu sammeln, dann zu prüfen und die brauchbaren dann dem DAO zu übergeben. Aber ich kenne eure Architektur nicht, ich übersehe warhscheinlich einen wichtigen Aspekt.
Das Active-Record Pattern hat mich dazu gezwungen, da die Aggregate bereits persistiert sein müssen um sie im Objekt zu setzen. Das "sammeln" habe ich dann so gelöst, dass ich ausschließlich mit POJO in Parser/GUI gearbeitet habe und nur zum persistieren/laden nach/von zu einem Active Record database object gemappt habe.
Ich habe angefangen auf Hibernate umzustellen und ein wenig Erfahrung gesammelt. Aber auch hier treten wieder Design Probleme auf, die ich nicht zu bewältigen weiß.

Unterstützt ActiveJDBC keine Transaktionen ? Ich kenne die Library nicht, aber folgender Link http://javalite.io/transactions läßt es mich vermuten.
Guter Punkt! Ja Transaktionen habe ich auch schon benutzt mit der Library. Ich möchte aber allgemein vom Active Record und Active JDBC mit fieser Bytecode-Instrumentierung weg.

Ich suche nach Best-Practices und Projekten in denen man eine Architektur in der Gesamtheit mit mehreren Entities und vollem Lifecycle/CRUD einer Entity finden kann. Ich finde bloß immer Tutorials wo gezeigt wird wie man einen Aspekt von CRUD mit Hibernate löst - super das bekomme ich auch hin aber ich suche nach einer Architektur.
Mein Ansatz war dieser:
Java:
@SuppressWarnings("unchecked")
public class GenericDAOImpl<E, ID extends Serializable> implements IGenericDAO<E, ID> {

    @Inject
    private EntityManager em;

    protected Class<? extends ID> daoType;

    public GenericDAOImpl() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        daoType = (Class) pt.getActualTypeArguments()[0];
    }

    @Override
    public void add(E entity) {
        em.getTransaction().begin();
        em.persist(entity);
        em.getTransaction().commit();
    }

    @Override
    public void saveOrUpdate(E entity) {
        em.getTransaction().begin();
        em.merge(entity);
        em.getTransaction().commit();
    }

    @Override
    public void update(E entity) {
        em.getTransaction().begin();
        em.merge(entity);
        em.getTransaction().commit();
    }

    @Override
    public void remove(E entity) {
        em.getTransaction().begin();
        em.remove(entity);
        em.getTransaction().commit();
    }

    @Override
    public E find(ID key) {
        em.getTransaction().begin();
        final E e = (E) em.find(daoType, key);
        em.getTransaction().commit();
        return e;
    }

    @Override
    public List<E> getAll() {
        return em.createQuery("Select t from " + daoType.getSimpleName() + " t").getResultList();
    }

    @Override
    public Optional<E> findFirst(String field, Object value) {
        EasyCriteria<? extends ID> easyCriteria = EasyCriteriaFactory.createQueryCriteria(em, daoType);
        return Optional.ofNullable((E) easyCriteria.andEquals(field,value).getSingleResult() );
    }

    @Override
    public E findOrCreate(String field, Object value) {
        throw new NotImplementedException();
    }

    @Override
    public E findOrCreate(E entity) {
        if ( !em.contains(entity) ) {
            add(entity);
        }
        return entity;
    }
}
Womit ich für jede Entity einen DAO anlege:
Java:
public class RecipeDAOImpl extends GenericDAOImpl<Recipe, Integer> implements IRecipeDAO {
Den ich per
Java:
@Inject
IRecipeDAO recipeDAO
benutzen kann.
Aber auch hier habe ich wieder angefangen. Wie hängt alles zusammen / wie löse ich bspw, dass ein Rezept zu einer Kategorie gehört, es aber ausreicht, wenn die Kategorie "wiederverwendet" wird und somit mehrere Rezepte die selbe Kategorie aggregiert haben. Oder hier am Beispiel das gleiche Problem mit Zutaten und deren Einheit und Mengenangabe.
Java:
public class RecipeDAOImpl extends GenericDAOImpl<Recipe, Integer> implements IRecipeDAO {

    @Inject
    private IIngredientDAO ingredientDAO;
    @Inject
    private IUnitDAO unitDAO;

    @Override
    public void addIngredient(final Recipe recipe, final String ingredientName, final double amount, String unitName) {

        final RecipeIngredient recipeIngredient = new RecipeIngredient();
        final Optional<Ingredient> persistedIngredient = ingredientDAO.findFirst("name", ingredientName);
        final Optional<Unit> persistedUnit = unitDAO.findFirst("name", unitName);

        if( !persistedIngredient.isPresent() ) {
            final Ingredient ingredient = new Ingredient();
            ingredient.setName(ingredientName);
            ingredientDAO.add(ingredient);
            recipeIngredient.setIngredient(ingredient);
        } else {
            recipeIngredient.setIngredient( persistedIngredient.get() );
            persistedIngredient.get().getRecipeIngredients().add(recipeIngredient);
        }

        if( !persistedUnit.isPresent() ) {
            final Unit unit = new Unit();
            unit.setName(unitName);
            unitDAO.add(unit);
            recipeIngredient.setUnit(unit);
        } else {
            recipeIngredient.setUnit( persistedUnit.get() );
            persistedUnit.get().getRecipeIngredients().add(recipeIngredient);
        }

        recipeIngredient.setAmount(amount);
        recipeIngredient.setRecipe(recipe);
        recipe.getRecipeIngredients().add(recipeIngredient);
        recipeIngredient.setRecipe(recipe);
    }
}
Das ist doch alles hässlich und verunsichert mich ob man das so aufbaut. Ist das Applikationslogik? Falls ja fühlt es sich ziemlich gefrickelt an so etwas "gewöhnliches" auf dieser Ebene zu tun.
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Das Active-Record Pattern hat mich dazu gezwungen, da die Aggregate bereits persistiert sein müssen um sie im Objekt zu setzen. Das "sammeln" habe ich dann so gelöst, dass ich ausschließlich mit POJO in Parser/GUI gearbeitet habe und nur zum persistieren/laden nach/von zu einem Active Record database object gemappt habe.
Ich habe angefangen auf Hibernate umzustellen und ein wenig Erfahrung gesammelt. Aber auch hier treten wieder Design Probleme auf, die ich nicht zu bewältigen weiß.
Hibernate erforder auch die eine oder andere Design-Anpassung, das wird sich nicht vermeiden lassen.
Hibernate löst diese Abhängigkeiten aber selbst auf. Relationen, welche noch nicht in der Datenbank sind, legt Hibernate selbst an. Die Zuordnung kann völlig unabhängig von der DB passieren.

Ich möchte aber allgemein vom Active Record und Active JDBC mit fieser Bytecode-Instrumentierung weg.
Hibernate ist da kein stückchen besser. Es erstellt Bytecode zur Laufzeit und benutzt Reflection, um Dinge zu Tun, die man eigentlich nicht tun sollte.

Iich suche nach einer Architektur.
Ganz grob angerissen:

Entity Recipe
interface RecipeRepository: Definiert Abfragen (z.B. find(int id), findAllContainingIngredient(Ingredient ingredient), ...)
class EMRecipeRepository implements RecipeRepository: Kommuniziert mit dem JPA EntityManager, sonst keine andere Klasse
class RecipeService: Entählt die Buisiness-Logik und benutzt ein RecipeRepository für die Persistenz.

Im Unit-Test kannst du dann RecipeRepository mocken.
 

Tobse

Top Contributor
Hier mal ein schnell zusammengehacktes Beispiel (nichtmal kompiliert, einfach nur runtergeschrieben):

Java:
@Entity
public class Recipe {
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "ingredient", orphanRemoval = true, fetch = FetchType.EAGER)
    private Set<IngredientAssociation> ingredients;

    private Recipe() { /* JPA */ }

    public Recipe(String name) {
        this.name = name;
    }

    public void setIngredientAmount(Ingredient ingredient, double amount, Amount.Unit amountUnit) {
        if (/* ingredients enthält einen eintrag für ingredient */) {
           eintrag.amount().setValue(amount);
            eintrag.amount().setUnit(amountUnit);
        } else {
            ingredients.add(new RecipeIngredientAssociation(ingredient, amount, amountUnit));
        }
    }

    // u.s.w.
}

interface RecipeRepository {
    public Recipe find(int id);

    public Collection<Recipe> findAllContainingIngredients(Ingredient... ingredients);

    public boolean add(Recipe recipe);

    public boolean remove(Recipe recipe);
}

@Singleton
class RecipeService {
    private RecipeRepository repository;
    private IngredientRepository ingredientRepository;

    @Inject
    public RecipeService(RecipeRepository repository, IngredientRepository ingredientRepository) {
        this.repository = repository;
        this.ingredientRepository = ingredientRepository;
    }

    // Read + Delete methoden
    public void setRecipeIngredientAmount(int recipeId, int ingredientId, double amount, Amount.Unit amountUnit) {
        Recipe r = repository.find(recipeId);
        Objects.requireNonNull(r, "Recipe #" + recipeId + " existiert nicht!");
    
        Ingredient i = ingredientRepository.find(ingredientId);
        Objects.requireNonNull(i, "Ingredient #" + ingredientId + " existiert nicht!");
    
        r.setIngredientAmount(i, amount, amountUnit);
    }
}

@Singleton
class EMRecipeRepository implements RecipeRepository {
    private EntityManager em;

    @Inject
    public EMRecipeRepository(EntityManager em) {
        this.em = em;
    }

    @Override
    public Recipe find(int id) {
        return this.em.find(Recipe.class, id);
    }

    @Override
    public Collection<Recipe> findAllContainingIngredients(Ingredient... ingredients) {
        return this.em.createQuery(
            "SELECT r, ri, i FROM Recipe JOIN r.ingredients ri JOIN ri.ingredient i WHERE i IN (?1)"
        )
            .setParameter(1, ingredients)
            .getResult();
    }

    @Override
    public boolean add(Recipe recipe) {
        if (!this.em.contains(recipe)) {
            this.em.persist(recipe);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean remove(Recipe recipe) {
        if (this.em.contains(recipe)) {
            this.em.remove(recipe);
            return true;
        } else {
            return false;
        }
    }
}

@Entity
class RecipeIngredientAssociation {
    private Ingredient ingredient;
    private Amount amount;

    private RecipeIngredientAssociation() { /* JPA */ }

    public RecipeIngredientAssociation(Ingredient ingredient, double amount, Amount.Unit amountUnit) {
        this.ingredient = ingredient;
        this.amount = new Amount(amount, amountUnit);
    }

    @Transient
    public Ingredient getIngredient() {
       return ingredient;
    }

    @Transient
    public Amount amount() {
       return amount;
    }
}

@Embeddable
public class Amount {
    private double value;
    private Unit unit;

    private Amount() { /* JPA */ }

    public Amount(double value, Unit unit) {
      this.value = value;
      this.unit = unit;
    }

    @Transient
    public double getValue() {
       return this.value;
    }

    @Transient
    public double getUnit() {
        return this.unit;
    }

    @Transient
    public void setValue(double value) {
        this.value = value;
    }

    @Transient
    public void setUnit(Unit unit) {
        this.unit = unit;
    }

    public static enum Unit {
        GRAMMS,
        LITERS,
        OUNCES,
        GALLONS // wahrscheinlich unnötig, aber was solls
    
        // kann auchnoch umrechungsmethden beinhalten
    }
}

@Entity
public class Ingredient {
    @Id
    @GeneratedValue
    private int id;

    private String name;

    private Ingredient() { /* JPA */ }

    public Ingredient(String name) {
        this.name = name;
    }

    @Transient
    public int getId() {
        return this.id;
    }

    @Transient
    public String getName() {
        return this.name;
    }
}

Das kann nun verwendet werden:
Java:
Ingredient salt= new Ingredient("Salz");
Ingredient wasser = new Ingredient("Wasser");
Recipe r = new Recipe("Salzwasser");
r.setIngredientAmount(wasser, 2, Amount.Unit.LITERS);
r.setIngredientAmount(salz, 20, Amount.Unit.GRAMMS);
recipeRepository.add(r);
entityManager.flush(); // Tada, fertig; Rezept, Salz, Wasser und die Zuordnungen sind in der DB
 
Zuletzt bearbeitet:

looparda

Top Contributor
Vielen Dank! Das ist im Prinzip so wie ich es schon habe. Das bestärkt mich, dass ich auf dem richtigen Weg bin.

Meine Beispiele für das wiederverwenden von Entities: ich möchte nicht 100x Zucker in der Datenbank haben, nur weil jedes 2. Rezept Zucker beinhaltet. Das habe ich ja versucht zu Umgehen durch meine addIngredient Methode. Allerdings ist das new RecipeIngredient dort noch fehl am Platz, da dies dafür sorgt, dass eine neue Assoziation angelegt wird. (Was aus der Sicht eines Updates von einem Objekt fatal ist, wenn diese Assoziation bereits besteht)
Wenn ich jedoch ein Set<RecipeIngredient> benutze und sage, dass ein RecipeIngredient dem anderen gleicht, wenn der Zutatenname gleich ist müsste das funktionieren, dass ich die Assoziation nicht mehr doppelt habe. Leider hat das riesen Einfluss auf JPA http://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma
Hast du Erfahrung mit den Strategie dazu oder wie würdest du das lösen?
 

Tobse

Top Contributor
In meinem Beispiel ist dieses Problem gelöst, indem ich die Zutat als eigene Entity modelliert habe. Wenn du dort den Namen als Primary-Key (@Id) deklarierst, sollte Hibernate damit zurechtkommen.

Du kannst ja auf deinem IngredientRepository auch eine Methode dafür anlegen:

Java:
public Ingredient findOrCreate(String ingredientName) {
    Ingredient existing = this.em.find(Ingredient.class, ingredientName);
    if (existing == null) {
        Ingredient newIngredient = new Ingredient(ingredientName);
        this.add(newIngredient);
        return newIngredient;
    } else {
        return existing;
    }
}
 

looparda

Top Contributor
Ich habe eine Entity RecipeIngredient, die Ingredient, Unit und Amount beinhaltet. Dass Zutaten und Einheiten nur einmalig angelegt werden funktioniert bereits so wie implementiert, auch wenn ich das auf findOrCreate umstellen sollte. Die Assoziation ist momentan das Problem, weil ich das nicht wie bei findOrCreate per Namen finden kann.
 

Anhänge

  • diagram.png
    diagram.png
    27,2 KB · Aufrufe: 34
Zuletzt bearbeitet:

Tobse

Top Contributor
Dann solltest du kein Problem bekommen. Im JPA-Kontext ist ein new allermeistens tatsächlich das erstellen einer neuen Entity. Du solltest new Ingredient dann also nur schreiben, wenn du eine neue Zutat hinzufügen willst. Wenn du die Ingredients aus dem EntityManager benutzt, um die Relationen herzustellen, sollte alles klappen.
 

looparda

Top Contributor
Ein Parser baut ein Recipe Objekt und gibt dieses zurück. Ist es valid wird es in die Datenbank gespeichert.
1.
Java:
tempIncredientList = extractIncredentsList(textFileContent);
for (int i = 0; i < tempIncredientList.size(); i++) {
    String tempName = cutString(tempIncredientList.get(i)[2],fieldLength);
    String tempUnit = cutString(tempIncredientList.get(i)[1],fieldLength);
    String tempAmount = cutString(tempIncredientList.get(i)[0],fieldLength);
    //         IngredientName, Amount, UnitName
    Unit unit = new Unit();
    unit.setName( tempUnit );
    unit = unitDAO.findOrCreate( unit, "title", tempUnit );
   
    Ingredient ingredient = new Ingredient();
    ingredient.setName(tempName);
    ingredient = ingredieDAO.findOrCreate( ingredient, "title", tempName );
   
   
    final RecipeIngredient recipeIngredient = new RecipeIngredient();

    recipeIngredient.setAmount( Double.valueOf(tempAmount) );
    recipeIngredient.setUnit( unit );
    recipeIngredient.setIngredient(ingredient);
    recipeIngredient.setRecipe(recipe);
    recipe.getRecipeIngredients().add(recipeIngredient);

}
Problem: Gehört dieses DAO Anfragen ob die Sachen schon in der Datenbank vorhanden sind wirklich in die Ebene eines Parsers?
2.
Java:
tempIncredientList = extractIncredentsList(textFileContent);
for (int i = 0; i < tempIncredientList.size(); i++) {
    String tempName = cutString(tempIncredientList.get(i)[2],fieldLength);
    String tempUnit = cutString(tempIncredientList.get(i)[1],fieldLength);
    String tempAmount = cutString(tempIncredientList.get(i)[0],fieldLength);
    recipe.getRecipeIngredients().add( tempName, Double.valueOf(tempAmount), tempUnit);
}
Logik aus 1 in die Model-Klasse Recipe verschoben.
Problem: Mein Model interagiert nun mit sämlichen DAO.
Wo gehört sowas hin? Und warum muss ich während ich ein Model auf Business-Logik-Ebene konstruiere schon auf die Dantenbank zugreifen und sogar Entities anlegen?
Ich brauch unbedingt ein Referenzprojekt an dem ich mir was abschauen kann.
 

Tobse

Top Contributor
Dein Parser sollte nicht mit der Datenbank Interagieren. Für diesen Anwendungsfall macht es sinn, dass du DTO-Klassen anlegst, die der Parser zurückgibt. Dein Service kann dann aus diesen DTO-Objekten in kooperation mit der DB Entities anlegen.
 

looparda

Top Contributor
Parser war jetzt das einfachste Beispiel. Was soll das erst in der GUI werden? Das wird wieder ein wildes hinundhergemappe zwischen POJO/DTO und Model-Objekten. Da war ich schon mal. Ich blicke das Gesamtbild eines vollständigen Lifecycles eine Objekts (das wiederum Objekte aggregiert hat) von Datenbank in Applikation und vice versa nicht.
 

Tobse

Top Contributor
Ich verstehe dein Problem leider nicht wirklich. Die GUI nimmt Enitäten entegegen und sie erstellt/modifiziert Entitäten. Ob deine Business-Logik die dann nacher verwirft oder nicht, ist doch ein völlig anderes Thema.
 

looparda

Top Contributor
Ich bin inzwischen gut voran gekommen. Der Parser benutzt keine DTO/POJO sondern die Entities und übergibt sie an den Service. Der Service nimmt das Rezept nochmal auseinandern und versucht Entities aus der Datenbank wiederzuverwenden bei gewünschten Attributen.
Java:
public void create(Recipe recipe) {
    ...
    recipe.setSource( sourceDAO.findOrCreate( recipe.getSource(), "name", recipe.getSource().getName() ) );
    //analog für alle gewünschten Attribute und Collections
}
Auch für die GUI möchte ich versuchen die Entities zu benutzten. Die scheint nach Recherche auch möglich zu sein, da man eine detached Entity wieder attachen kann.

Außerdem konnte ich meinen GenericDAO sehr gut durch eine kleiner Änderung am Konstruktor zum Injecten mit Guice nutzen:
Java:
bind(new TypeLiteral<IGenericDAO<Cookbook, Integer>>(){}).to(new TypeLiteral<GenericDAOImpl<Cookbook, Integer>>(){}).in(Scopes.SINGLETON);
...
@Inject
private IGenericDAO<Cookbook, Integer> cookbookDAO;

Ich denke ich bin wieder auf Implementierungsebene angelangt und kann mich weiter mit JPA rumschlagen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Mongodb tree Architektur Datenbankprogrammierung 6
B Derby/JavaDB Client-Server-Architektur mit Datenbank Datenbankprogrammierung 6
X PostgreSQL Hibernate geschickte Architektur Datenbankprogrammierung 2
L Programm-Architektur bei DB-Zugriff Datenbankprogrammierung 6
D Verknüpfung auflösen für Frontend Datenbankprogrammierung 7
R Beste Lösung für User Erstellung in mongodb Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
Zrebna Empfehlung für ein kostenloses DB-Hosting gesucht Datenbankprogrammierung 6
M Lösungsvorschläge für Multi-User Datenbankprogrammierung 1
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Denkanstoß für Ranking Datenbankprogrammierung 1
L Oracle Repräsentative Namen für die Column Types Datenbankprogrammierung 9
OnDemand Struktur für Parent / Child Produkt Datenbankprogrammierung 5
N ORM für Sqlite Datenbankprogrammierung 4
I Konzept: Klasse / Entity für Einstellung der Software Datenbankprogrammierung 3
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
Danloc Informationen für Datenbankverbindung wo/wie speichern? Datenbankprogrammierung 11
J Warum sind Sockets für einen Live-Chat sinnvoll? Datenbankprogrammierung 8
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
X PostgreSQL Datenbankdesign für Vokabeltrainer Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
M Idee Umsetzung //NFC Eintrittskarten für Geburtstag Datenbankprogrammierung 2
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
J SQLite Ich muss für mein Projekt meine Datenbank Kapseln Datenbankprogrammierung 2
J Tipps für ERM Datenbankprogrammierung 4
P Highlevel-Lösung für Speicherung von Baumstruktur mit unbekannter Tiefe Datenbankprogrammierung 1
F welche Datenbank für Messwerte? Datenbankprogrammierung 4
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
M DB Schema für Vokabeltrainer Datenbankprogrammierung 2
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
S HSQLDB Fehlermeldung für den Bildschirm Datenbankprogrammierung 3
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
I Query für Geburtstage Datenbankprogrammierung 6
L Zentrale Datenbank im Internet für Spiele Highscores? Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
ruutaiokwu code-formatter für t-sql... Datenbankprogrammierung 12
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
T Mehrsprachigkeit für Tabellenfelder Datenbankprogrammierung 6
E MySQL Große Datenmengen reibungslos speichern für Gameserver Datenbankprogrammierung 6
F MSSql oder MongoDB für die Speicherung von POI Datenbankprogrammierung 9
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J Datenbank für Fragen/ Antworten Datenbankprogrammierung 7
O Datenbankschnittstelle für Java Datenbankprogrammierung 8
L Datenbank für kleinere Anwendungen Datenbankprogrammierung 3
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S ich brauche tipps für JDBC Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
GianaSisters SQL Befehl für allgemeine Datenbankexistenz Datenbankprogrammierung 4
B Beispiel für sicheres DBUsername/DBPassword handling Datenbankprogrammierung 4
I Anfänger-Tutorial für Hibernate gesucht Datenbankprogrammierung 3
heart_disease Beratung für Datenbankdesign Datenbankprogrammierung 13
C Embedded DB für Java Datenbankprogrammierung 26
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
F Performance-Tool für Oracle Datenbankprogrammierung 2
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
C Split String für SQl query Datenbankprogrammierung 10
A update methode für datenbank Datenbankprogrammierung 2
N Datenbank für Dateien Datenbankprogrammierung 6
N Datenbank für einen Stundenplan Datenbankprogrammierung 4
G welche Datenbanktabellen für folgende Attribute Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
S JPA (EntityManager für jeden Nutzer?) Datenbankprogrammierung 8
J Buffer Manager für Datenbank Datenbankprogrammierung 4
F SQL Voraussetzung für JDBC? Datenbankprogrammierung 10
R Bei Webformular DropDown Felder JA, NEIN! Was für einen Datentyp verwenden? Datenbankprogrammierung 7
T SSL Zertifikat für mysql datenbankzugriff Datenbankprogrammierung 6
T Debugger für SQL? Datenbankprogrammierung 5
Chtonian Effizientes Query System für Wortnachschlagewerk Datenbankprogrammierung 9
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
A Struct für Datenbank abfrage? Datenbankprogrammierung 12
O Hibernate für Eclipse Datenbankprogrammierung 5
T JPQL Query für eine Tabellenansicht Datenbankprogrammierung 2
D Sicherheit für Datenbankverbindung Datenbankprogrammierung 19
S Standard für Datenbanken Datenbankprogrammierung 3
R Entfernte MySQL Datenbank für lokale Swing-App Datenbankprogrammierung 8
Landei Mehre Werte für einen Prepared-Statement_Parameter übergeben? Datenbankprogrammierung 3
G Einheitliches Casting für Decimal und Integer-Werte Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben