Sto usando Spring Boot con JPA / Hibernate e sto cercando di disaccoppiare il livello aziendale dal livello dati. Mi piacerebbe essere in grado (relativamente facilmente) di passare da un database relazionale a un triplo store rdf.
Ecco una descrizione semplificata parziale del mio tentativo corrente. Ho entità come:
@Entity(name="Drawer")
public class DrawerEntity {
@Id
private int id;
private String label;
public int getId(){return id;}
public void setId(int id){this.id=id;}
public String getLabel(){return label;}
public void setLabel(String label){this.label=label;}
}
Ho oggetti business che fungono da proxy per entità come:
public class Drawer{
@Autowired
private CardRepository cardRepository;
private DrawerEntity drawerEntity;
public Drawer(){this.drawerEntity = new DrawerEntity();}
public Drawer(DrawerEntity drawerEntity){this.drawerEntity = drawerEntity;}
public int getId(){return drawerEntity.getId();}
public void setId(int id){drawerEntity.setId(id);}
public String getLabel(){return drawerEntity.getLabel();}
public void setLabel(String label){drawerEntity.setLabel(label);}
public int getNumberOfCards(){return cardRepository.countByDrawerId(this.getId());}
}
Ho anche un livello di servizio:
public interface DrawerService {
Collection<Drawer> findAll();
Drawer findOne(int id);
Drawer create(Drawer drawer);
void delete(int id);
}
Implementato da DrawerServiceBean
@Service
public class DrawerServiceBean implements DrawerService {
@Autowired
private DrawerRepository drawerRepository;
@Override
public Collection<Drawer> findAll() {
Collection<Drawer> allCard = new ArrayList<>();
for(DrawerEntity drawerEntity : drawerRepository.findAll()){
allCard.add(new Drawer(drawerEntity));
}
return allCard;
}
@Override
public Drawer findOne(int id) {return new Drawer(drawerRepository.findOne(id));}
@Override
public Drawer create(Drawer drawer) {return new Drawer(drawerRepository.save(drawer.getDrawerEntity()));}
@Override
public void delete(int id) {drawerRepository.delete(id);}
}
Che è collegato a un repository JPA
@Repository
public interface DrawerRepository extends JpaRepository<DrawerEntity, Integer> {}
Seguendo i consigli forniti in questa risposta , non sto iniettando nulla nelle entità e sto usando business oggetti proxy. Ma poi, sembra che devo usare @Configurable
e AspectJ LTW per l'iniezione dei repository negli oggetti business perché "< a href="http://docs.spring.io/autorepo/docs/spring/4.3.x/spring-framework-reference/html/aop.html#aop-pointcuts"> Spring AOP supporta solo i punti di join dell'esecuzione del metodo per Fagioli primaverili ".
L'obiettivo di questa architettura era di essere in grado di definire metodi come getNumberOfCards
negli oggetti business che utilizzano diversi tipi di repository ( CardRepository
, DrawerRepository
). Ma il risultato sembra complesso con un sacco di codice boilerplate. Mi chiedo come posso semplificare questo? È necessaria la programmazione orientata agli aspetti? Posso ridurre la dimensione del codice boilerplate? Esistono alcune soluzioni fornite da Spring Data?