Avancé
Avancé – Utiliser les contraintes de Generic System
Toute base de données qui se respecte permet de poser des contraintes.
Generic System le permet également. Abordons dans un premier temps comment les utiliser.
Utilisation des contraintes
Prenons trois contraintes utilisateur et voyons comment les appliquer avec notre exemple maintenant bien connu de Vehicle.
PropertyConstraint
La première contrainte est PropertyConstraint.
Une nouvelle gamme de voiture est récemment apparue sur le marché et ne peut avoir qu’une seule options à la fois. Par chance, c’est justement la contrainte que nous voulons tester !
Engine engine = new Engine();
// Create a type Vehicle
Generic vehicle = engine.setInstance("Vehicle");
// Create the attribute Options for the type Vehicle
Generic options = vehicle.setAttribute("Options");
// Only one value for Options : enable property constraint
options.enablePropertyConstraint();
// Create an instance of Vehicle
Generic myVehicle = vehicle.setInstance("myVehicle");
// Add values for Options
myVehicle.setHolder(options, "music player"); // OK
// Persist changes
engine.getCurrentCache().flush();
try {
myVehicle.addHolder(options, "air conditioning");
} catch (RollbackException e) {
assert e.getCause() instanceof PropertyConstraintViolationException;
}
InstanceValueClassConstraint
Continuons avec notre deuxième contrainte InstanceValueClassConstraint. Nous allons la poser sur Options pour contraindre sa classe à String :
Engine engine = new Engine();
// Create a type Vehicle
Generic vehicle = engine.setInstance("Vehicle");
// Create the attribute Options for the type Vehicle
Generic options = vehicle.setAttribute("Options");
// Constrains the type of Options to String
options.setInstanceValueClassConstraint(String.class);
// Create an instance of Vehicle
Generic myVehicle = vehicle.setInstance("myVehicle");
// Add values for Options
myVehicle.setHolder(options, "music player"); // OK
// Persist changes
engine.getCurrentCache().flush();
try {
myVehicle.addHolder(options, 123);
} catch (RollbackException e) {
assert e.getCause() instanceof InstanceValueClassConstraintViolationException;
}
SingularConstraint
Terminons avec notre dernière contrainte SingularConstraint.
Cette nouvelle gamme de voiture est décidément très limitée : elle ne peut avoir qu’une couleur.
Nous expliquerons dans un prochain billet à quoi correspond ApiStatics.BASE_POSITION.
Engine engine = new Engine();
// Create a type Vehicle
Generic vehicle = engine.setInstance("Vehicle");
// Create a type Color
Generic color = engine.setInstance("Color");
// Create the relation VehicleColor between Vehicle and Color
Generic vehicleColor = vehicle.setRelation("VehicleColor", color);
// Instances of Vehicle can be linked to 1 Color maximum
vehicleColor.enableSingularConstraint(ApiStatics.BASE_POSITION);
// Create an instance of Vehicle
Generic myVehicle = vehicle.setInstance("myVehicle");
// Create an instance of Color
Generic red = color.setInstance("red");
// Create another instance of Color
Generic yellow = color.setInstance("yellow");
// Create the link between myVehicle and red from the relation VehicleColor
myVehicle.setLink(vehicleColor, "myVehicleRed", red); // OK
// Persist changes
engine.getCurrentCache().flush();
try {
// Create the link between myVehicle and yellow from the relation VehicleColor
myVehicle.addLink(vehicleColor, "myVehicleYellow", yellow);
} catch (RollbackException e) {
assert e.getCause() instanceof SingularConstraintViolationException;
}
En résumé
Nous avons vu à travers trois exemples comment utiliser les contraintes mais il y en a d’autres.
Nous avons vu avec la pratique comment utiliser les contraintes de Generic System.
Voyons maintenant la théorie : les contraintes de Generic System.
