[Java lista] Nyári uborkaszezon idejére Transfer Object kérdés

Szomor Attila aszomor at computertechnika.hu
2009. Júl. 8., Sze, 17:36:37 CEST


Db.ear
   Entities.jar (csak Entity definiciók)
   EntityClients.jar (csak a Local és Remote interface-ek)
   EntityUnit.jar (Persistence.xml és az EJB-k, stb.)

DbClient.ear (használja a Entities.jar és EntityClients.jar-t)
   TransferObjects.jar (csak TO definiciók)
   TransferObjectAssemblers.jar (csak az Entity to TransferObject helperek)
   TransferObjectClients.jar (csak a Local és Remote interface-ek)
   TransferObjectUnit.jar (EJB-k, stb)

a szabály az hogy a Db-t csak a DbClient-en át lehet elérni, as további  
szintek csak a TransferObjects.jar és a TransferObjectClients.jar  
használják mindegy hogy webes vagy gui kliensek vagy akár az üzleti logika  
EJB-k.

Ha nézzünk egy egyszerű példát:

Entities
--------
public class PlaceClass implements Serializable {
       ...
       @OneToMany(cascade = CascadeType.ALL, mappedBy = "classClagroId")
       private Collection<PlaceGroP> placeGroPCollection;
       ...
}
public class PlaceGroP implements Serializable {
       ...
       @JoinColumn(name = "class_clagro_id", referencedColumnName = "id",
nullable = false)
       @ManyToOne(optional = false)
       private PlaceClass classClagroId;
       ...
}

Jól látszik PlaceClass-hoz tartoznak PlaceGroP-k (osztály és a részlegei  
egyszerű master-detail kapcsolat), viszont az is látszik, hogy minden  
detail elem tartalmazza a mastert, ami öröm ha a detail irányból megyek  
mert mindig kéznel van a gazdi.
Na most ha ezt a PlaceClass-t TO-ra forditjuk amint leérünk  
placeGroPCollection elemekbe és azoknak is a classClagroId-hez újból a  
PlaceClass-ban találjuk magunkat mindaddig amíg el nem fogy a memória.
Íme a halált okozó sor:
  transferObject.setClassClagroId(PlaceClassAssembler.getTransferObject(entity.getClassClagroId()));
és a környzete:

public class PlaceClassAssembler {
       ...
       public static final PlaceClassTO getTransferObject(PlaceClass  
entity) {
               PlaceClassTO transferObject;
               if (entity == null) {
                     transferObject = null;
               } else {
                     transferObject = new PlaceClassTO();
                     setTransferObject(entity, transferObject);
               }
               return transferObject;
       }

       public static final PlaceClass getEntity(PlaceClassTO  
transferObject) {
               PlaceClass entity;
               if (transferObject == null) {
                    entity = null;
               } else {
                    entity = new PlaceClass();
                    setEntity(entity, transferObject);
               }
               return entity;
       }

       public static final void setTransferObject(PlaceClass entity,  
PlaceClassTO transferObject) {
               transferObject.setPlaceClassLetrehozva(entity.getCreated());
               transferObject.setPlaceClassModositva(entity.getModified());
               transferObject.setPlaceClassOsztalyKodja(entity.getClcod());
               ...
       }

       public static final void setEntity(PlaceClass entity, PlaceClassTO  
transferObject) {
               entity.setCreated(transferObject.getPlaceClassLetrehozva());
               entity.setModified(transferObject.getPlaceClassModositva());
               entity.setClcod(transferObject.getPlaceClassOsztalyKodja());
               ....
       }
       ...
}


public class PlaceGroPAssembler {
       ...
       public static final void setTransferObject(PlaceGroP entity,  
PlaceGroPTO transferObject) {
               ....
               transferObject.setClassClagroId(PlaceClassAssembler.getTransferObject(entity.getClassClagroId()));
               ...

       }
       ...
}


További információk a(z) Javalist levelezőlistáról