design per supportare entità con immagini

2

Ho più entità come Hotel, Città di destinazione ecc. che possono contenere immagini. Il modo in cui ora ho il mio sistema è, penso a tutte le immagini che appartengono a questo set universale (una tabella nel DB contiene filePath a tutte le immagini).

Quando devo aggiungere un'immagine a un'entità, vedo se l'entità esiste in questo insieme universale di immagini. Se esiste, collega il riferimento a questa immagine, altrimenti crea una nuova immagine. Per esempio:.

class ImageEntityHibernateDAO {
        public void addImageToEntity(IContainImage entity, String filePath,
                String title, String altText) {
            ImageEntity image = this.getImage(filePath);

            if (image == null)
                image = new ImageEntity(filePath, title, altText);

            getSession().beginTransaction();
                entity.getImages().add(image);
            getSession().getTransaction().commit();

        }
}

La mia domanda è: prima dovevo scrivere questo codice per ogni entità (e ogni entità avrebbe una collezione Set). Quindi, invece di riscrivere lo stesso codice, ho creato la seguente interfaccia:

public interface IContainImage {
    Set<ImageEntity> getImages();
}

Le entità che dispongono di raccolte di immagini implementano anche l'interfaccia IContainImage . Ora, per qualsiasi entità che deve supportare l'aggiunta di funzionalità Image, tutto ciò che devo richiamare da DAO è qualcosa del tipo:

// in DestinationDAO::addImageToDestination {
imageDao.addImageToEntity(destination, imageFileName, imageTitle, imageAltText);

// in HotelDAO::addImageToHotel {
imageDao.addImageToEntity(hotel, imageFileName, imageTitle, imageAltText);

Sarebbe di grande aiuto se qualcuno potesse fornirmi qualche critica su questo design? Ci sono dei difetti che non vedo subito?

    
posta brainydexter 15.03.2012 - 08:02
fonte

2 risposte

1

Che ne dici di una funzione di aggiunta diritta sull'interfaccia IContainImage. per es.

public interface IContainImage {
    Set<ImageEntity> getImages();
    void Add(ImageEntity);
}

Questo potrebbe essere più semplice:

try
{ 
  getSession().beginTransaction();
  entity.Add(image);
  getSession().getTransaction().commit();
}
except
{
  getSession().getTransaction().Rollback();
}

Ho più entità come Hotel, Città di destinazione ecc. che possono contenere immagini.
Sembra che tu abbia a che fare con una relazione classica da tavolo a molti. Per questo è necessario introdurre un tavolo di conversione / unione. Questa è una tabella contenente la chiave primaria della tabella delle entità e la chiave primaria della tabella delle immagini.

    
risposta data 04.07.2012 - 08:16
fonte
0

Potrei sbagliarmi ma dalla domanda ho avuto l'impressione che a un'entità potesse essere associata solo un'immagine. Se è solo l'immagine per Entità, allora perché avere questo tipo di strutturazione? IMHO, pagheresti una penalizzazione delle prestazioni per cercare se un'immagine esiste già nel set prima di aggiungerla.

Un design più semplice non avrebbe avuto una relazione 1: 1 tra entità come Hotel, Città e ImageEntity?

Anche se hai bisogno di un set di immagini per un Entity come Hotel - dovrebbe comunque essere una relazione 1: M tra di loro. Un set universale non ti darà il vantaggio in quanto l'immagine di un'entità non può essere riutilizzata per altre entità.

    
risposta data 29.03.2012 - 11:28
fonte

Leggi altre domande sui tag