Parent/Childs/Parent Problem


Hallo zusammen,

ich habe eine Designfrage. Und zwar geht es um einen Graph von Parent/Child Beziehungen, in denen jeder Parent auch Child un umgekehrt sein kann.

Ich arbeite mit JBoss Seam und Hibernate Annotationen um die Entitäten zu bilden. Ich meine zwar eine Lösung gefunden zu haben, allerdings habe ich ein Performance Problem beim Löschen der Objekte.
Deshalb die Frage, ob jemand evtl. ein besseres Design für diese Datenstruktur weiß.

Als Basisklasse verwende ich eine abstrakte Klasse von der alle Entitäten dieser Parent/Child Beziehung erben.
Code:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BaseCategory<T extends StandardEntity> extends StandardEntity {

   private Long id;
   private List<T> childs;
   private T parent;
   
   
   @Id @GeneratedValue(strategy=GenerationType.TABLE)
   public Long getId(){return id;}
   public void setId(Long id){this.id = id;}

   @OneToMany(cascade=CascadeType.ALL, targetEntity=BaseCategory.class, mappedBy="parent")
   public List<T> getChilds() {return childs;}
   public void setChilds(List<T> childs) {this.childs = childs;}
   
   @ManyToOne()
   public T getParent() {return parent;}
   public void setParent(T parent) {this.parent = parent;}
}

Und es gibt eine Reihe von Klassen, die diese Basisklasse erben, die alle so aufgebaut sind wie die folgende
Code:
@Entity
@Name("package")
public class Package extends BaseCategory<BaseCategory> implements Serializable {

   
   private static final long serialVersionUID = 5330799040159648995L;
   private Long package_id;
   private String package_name;
   private Long package_totalCount = new Long(0);
   
   
   public Long getPackage_id() {return package_id;}
   public void setPackage_id(Long package_id) {this.ackage_id = ackage_id;}
   
   public String getPackage_name() {return package_name;}
   public void setPackage_name(String package_name) {this.package_name = package_name;}
   
   public Long getPackage_totalCount() {return package_totalCount;}
   public void setPackage_totalCount(Long package_totalCount) {this.package_totalCount = package_totalCount;}

}

Eine Verwendung dieser Struktur in der Geschäftsklasse kann so wie folgt aussehen
Code:
records = new ArrayList<BaseCategory>();

package= new Package();
package.setPackage_id(Long.valueOf(w94aufnpTemp));
package.setPackage_name(w91bezei);
package.setChilds(new ArrayList<BaseCategory>());
records.add(package);

service = new Service();
service.setService_id(Long.valueOf(w94teilnTemp));
service.setService_name(w94bezei);
package.getChilds().add(service);
service.setChilds(new ArrayList<BaseCategory>());
service.setParent(package);

cardType = new KardType();
cardType.setKardType_name(w40klassTemp);
service.getChilds().add(cardType);
cardType.setChilds(new ArrayList<BaseCategory>());
cardType.setParent(service);

Package package;
for (BaseCategory pge : records) {
   if (pge.getClass().getSimpleName().equals("Package")) {
      package = (Package) pge;
      entityManager.persist(package);
   }
}
entityManager.flush();

Beim Erstellen läuft alles ohne Probleme und alle Objekte werden in die Datenbank abgebildet. Versuche ich allerdings eine Liste dieser Parent/Child Beziehungen zu löschen dauert es eine Ewigkeit und der PC ist fast vollständig ausgelastet.
Code:
entityManager.remove(package);

Ich verwende eine MySQL Datenbank. Im MySQL Administrator werden mir beim löschen ständig wechselt die Meldungen "freeing items" und "removing tmp table" ausgegeben.

Hat jemand eventuell ein besseres Design oder sonst eine Idee für die Lösung dieses Problems?

Wäre euch sehr Dankbar.

Gruß
Andreas
 
Zuletzt bearbeitet:

Neue Beiträge