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 !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Engine engine = new Engine(); // Create a type Vehicle Generic vehicle = engine.addInstance("Vehicle"); // Create the attribute Options for the type Vehicle Generic options = vehicle.addAttribute("Options"); // Only one value for Options : enable property constraint options.enablePropertyConstraint(); // Create an instance of Vehicle Generic myVehicle = vehicle.addInstance("myVehicle"); // Add values for Options myVehicle.addHolder(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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Engine engine = new Engine(); // Create a type Vehicle Generic vehicle = engine.addInstance("Vehicle"); // Create the attribute Options for the type Vehicle Generic options = vehicle.addAttribute("Options"); // Constrains the type of Options to String options.enableClassConstraint(String.class); // Create an instance of Vehicle Generic myVehicle = vehicle.addInstance("myVehicle"); // Add values for Options myVehicle.addHolder(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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Engine engine = new Engine(); // Create a type Vehicle Generic vehicle = engine.addInstance("Vehicle"); // Create a type Color Generic color = engine.addInstance("Color"); // Create the relation VehicleColor between Vehicle and Color Generic vehicleColor = vehicle.addRelation("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.addInstance("myVehicle"); // Create an instance of Color Generic red = color.addInstance("red"); // Create another instance of Color Generic yellow = color.addInstance("yellow"); // Create the link between myVehicle and red from the relation VehicleColor myVehicle.addLink(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.