Spécification d'un nom de tâche dans une unité de persistance JPA
Indiquez un Nom de tâche dans une unité de persistance JPA (Java™ Persistence API)
Pourquoi et quand exécuter cette tâche
Un Nom de tâche est défini dans le fichier persistence.xml avec
le nom de propriété wsjpa.AccessIntent dans une unité de persistance. La valeur de la
propriété est une liste de Noms de tâches, de types d'entités et de définitions de tentatives d'accès. L'exemple ci-après indique le contenu de la propriété wsjpa.AccessIntent
dans une unité de persistance.
<property name = "wsjpa.AccessIntent"
value = "Tasks=' <nom de tâche> { <nom d'entité> ( <valeurVerrouIsolement> ) } ' "/>
A A A | | |
| | +--------- , --------+ | |
| +----------------- , -----------------+ |
+----------------------- , --------------------------+
Tasks ::= <tâche> [ ',' <tâche> ]*
<tâche> ::= <nom de tâche> '{' <entité> [ ',' <entité> ]* '}'
<entité> ::= <nom d'entité> '(' <ValeursVerrouIsolement> ')'
<nom de tâche> ::= <identificateur_complet>
<nom d'entité> ::= <identificateur_complet>
<identificateur_complet> ::= <identificateur> [ '.' <identificateur> ]*
<identificateur> ::= <idCaractèreDémarrage> [ <idCaractère> ]*
<idCaractèreDémarrage> ::= Character.isJavaIdentifierStart | '?' | '*'
<idCaractèreDémarrage> ::= Character.isJavaIdentifierPart | '?' | '*'
<ValeursVerrouIsolement> ::= <ValeurVerrouIsolement> [ ',' <ValeurVerrouIsolement> ]
<ValeurVerrouIsolement> ::= <isolement> | <verrouenlecture>
<isolement> ::= "isolement" '=' <ValeurIsolement>
<Verrouenlecture> ::= "readlock" '=' <Valeurverrouenlecture>
<Valeurisolement> ::= "read-uncommitted"|"read-committed"|"repeatable-read"|"serializable"
<ValeurEnLectureSeule> ::= "read" | "write"
Avant de définir un Nom de tâche dans une unité de persistance, tenez compte des remarques suivantes :- Les blancs sont ignorés entre les marqueurs.
- Seuls les contenus <isolement> et <verrou en lecture> ne sont pas sensibles à la casse.
- Le <Nom de tâche> est représenté sous la forme d'un nom de méthode entièrement qualifié du module, comme com.acme.bean.MyBean.increment, ou un nom de tâche arbitraire défini par l'utilisateur comme MyProfile.
- Le <Nom d'entité> est représenté sous la forme d'un nom de classe entièrement qualifié du module comme com.acme.bean.Entity1.
- Les caractères génériques '?' ou '*' peuvent être utilisés dans le <Nom de tâche> et le <Nom d'entité>. "?" correspond à tout caractère unique et "*" correspond à zéro ou plusieurs caractères de séquences.
- Seules les valeurs hintNames isolation et readLock sont autorisées sur une définition de tâche et l'ordre n'est pas important
- Si readLock a la valeur write, alors l'isolement doit être repeatable-read ou serializable
- Si readLock a la valeur read, cela n'a aucun effet si l'isolement est read-uncommitted.
L'exemple de code ci-après indique comment spécifier un Nom de tâche dans une
unité de persistance JPA.
package my.company;
@Remote
class Ejb1 {
// assumer no tx from the caller
@TransactionAttribute(Requires)
public void caller_Method1() {
// une nouvelle transaction implicite commence
// Nom de tâche "my.company.Ejb1.caller_Method1" défini sous TSR
ejb1.callee_Method?();
}
@TransactionAttribute(RequiredNew)
public void callee_Method2() {
// une nouvelle transaction implicite commence c-à-d TxRequiredNew.
// Nom de tâche "my.company.Ejb1.callee_Method2" défini sous TSR
}
@TransactionAttribute(Requires)
public void callee_Method3() {
// Dans la transaction de l'appelant, le Nom de tâche reste donc
// "my.company.Ejb1.caller_Method1"
}
@TransactionAttribute(NotSupported)
public void callee_LocalTx () {
// Transaction non spécifiée, une nouvelle transaction locale a commencé implicitement.
// TaskName "my.company.Ejb1.callee_LocalTx" set on TSR
}
}
Comme un caractère générique peut être utilisé pour spécifier un Nom de tâche et un type d'entité, des correspondances de spécifications multiples peuvent survenir lors de la phase d'exécution.
L'ordre défini dans la propriété
wsjpa.AccessIntent sera utilisé pour rechercher les noms de tâches et les types d'entités.
<properties>
<property name="wsjpa.AccessIntent" value="Tasks="
*.Task1 { *.Employee1 ( isolation=read-uncommitted ),
*.Employee? ( isolation=repeatable-read, readlock=write ),
},
* { *.Employee3 ( isolation=serializable, readlock=write ) },
'" />
</properties>