Champs physique d'un objet herité

Bonjour,

J’ai cherché dans les training et dans le doc sans succès sur le comportement des objets herités.

Je souhaite savoir comment l’objet B qui herite de A stocke ses propres champs. De ce que j’ai compris, l’obejt B stock ses champs dans le table de A. Comment alimenter ces champs en java :

private void update(String rowIdA,X obj) {

		ObjectDB b = getGrant().getTmpObject("B");
		b.resetFilters();
		if (b.select(rowIdA)) {
			b.setFieldValue("xx", obj.getFieldValue("xx"));
			b.save();
		}
	}

De cette manière je n’ai pas d’erreur mais les champs des sont pas persistés…

Merci d’avance!

Je ne suis pas sûr de comprendre votre pb…

Prenons le cas basique suivant:

  • B hérite de A (et les deux ayant la même table physique)
  • A a un attribut a1
  • B un attribut b1 (et donc a aussi a1 puisqu’il hérite de A)

Alors:

  • Dans le code relatif à A vous pouvez manipuler uniquement a1
  • Dans le code relatif à B vous pouvez manipuler a1 et b1

Pour le reste la persistance en base est indépendante du fait d’être dans un contexte d’héritage ou non, elle est uniquement liée au nom de colonne de vos attributs (si le nom de colonne physique est vide l’attribut ne sera pas persistant)

Votre exemple est très clair.

Ici mon problème, c’est que b1 (“xx” dans mon cas) ne semble pas être persisté avec le code que j’utilise. Je souhaiterais savoir si le code est bon, au quel cas il faut que je cherche le problème ailleurs.

Vérifiez déjà si votre attribut a bien un nom de colonne.

Ensuite votre code n’est pas correctement ecrit dans le cas général car vous devez:

  1. appeler le validate afin d’appliquer les règles de validation (y compris les règles additionnelles de vos pre/postValidate) et checker ses éventuels messages de retour
  2. vérifier l’éventuel message de retour du save

Ou plus simplement utiliser le wrapper BusinessObjectTool, genre:

try {
    new BusinessObjectTool(myobj).validateAndSave();
} catch (Exception e) {
   AppLog.error("There was an error saving " + myobj.getName(), e, getGrant());
}

Avec ce wrapper, en cas d’erreur au validate ou au save vous aurez une exception.