I miei suggerimenti:
- Rimuovi l'estratto dal tuo modello di credito. Perché : la tua applicazione principale (app di credito) deve funzionare indipendentemente da qualsiasi client e qualsiasi database. Dovresti essere in grado di testare l'unità senza UI o DB. Pertanto, il database dovrebbe idealmente essere un plug-in per la tua app principale (registrata da una specifica applicazione delle tue regole aziendali principali). In questo modo, l'applicazione principale deve definire che cos'è un modello di credito, indipendentemente dal database
- Il tuo servizio dovrebbe ricevere istanze di credito dal cliente. Secondo il tuo esempio, il cliente dovrebbe essere perfettamente in grado di chiamare il metodo di servizio che gli trasmette un credito.
- Implementa il livello di accesso ai dati più necessario. Poiché hai già definito un'interfaccia Dao, è facile rendere il DB un plug-in per la tua app. Ora, creane alcuni ad es. HibernateDataAccess layer per i tuoi dati e implementa tutte le specifiche per la persistenza in questa libreria (di nuovo: queste specifiche non dovrebbero essere all'interno del modello di credito - ecco perché mi hai detto che era astratto)
- Crea un'applicazione e, nel punto di accesso di questa applicazione, "registri" al servizio l'oggetto ICreditDao (tramite l'iniezione di dipendenza) che sarà responsabile della persistenza dei modelli di credito della tua app.
Si noti che questi suggerimenti non sono strettamente correlati a Java. Per maggiori informazioni, dai un'occhiata a "Clean Architecture" di Bob Martin ( link )
EDIT: qui proverò a fornire alcuni esempi di codice per illustrare i miei punti e rispondere a tutte le tue domande.
Progetto CreditCoreLibrary
//Defines a model for Credit, to be used by a client application
public class Credit {
//...attributes
public CreditAttachable getCreditAttachable() {
///...
}
public double getAmount() {
///...
}
}
//Needs to be implemented by another library, to be used by
//the client application
public interface CreditDao {
void SaveOrCreate(Credit credit);
IList<Credit> getAll();
}
public class CreditService {
private CreditDao creditDao;
public CreditService(CreditDao creditDao) {
//The service relies on the concrete implementation of
//the Dao, provided by the client app
this.creditDao = creditDao;
}
//Methods receive and return Credit models defined in this core library
public void AddCredit(Credit credit) {
creditDao.SaveOrCreate(credit);
}
public IList<Credit> GetCreditList() {
return creditDao.GetAll();
}
}
CreditHibernateDataAccessLibrary project
Ecco un file di mapping xml che associa una colonna in DB a una proprietà nella classe:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Ecco un'implementazione Tao specifica, che utilizza l'API di Hibernate:
public class HBCreditDao implements CreditDao {
//...uses Hibernate API to perform CRUD on your DB
//...which will use the mapping xml file to be able
//to create Credit objects based on DB data
}
Progetto MyApplication (potrebbe essere un'app Web o anche un'app console)
//This is just an example, but it means that in your application
//entry point, you need to "register" the Daos used by your app
//in the Service
int main() {
//This project uses CreditHibernateDataAccessLibrary.jar
HBCreditDao myDao = new HBCreditDao();
//This project uses CreditCoreLibrary.jar
//This injects a specific Dao object into the service
CreditService service = new CreditService(myDao);
//Perform operations using the service
IList<Credit> creditList = service.GetCreditList();
}
PLUS: visualizza ulteriori informazioni sui file di mapping di Hibernate ( link )