Tasknamen in einer JPA-Persistenzeinheit festlegen
Sie können einen Tasknamen in der JPA-Persistenzeinheit (Java™ Persistence API) festlegen.
Informationen zu diesem Vorgang
Ein Taskname wird in der Datei persistence.xml über die Eigenschaft mit dem Namen
wsjpa.AccessIntent in einer Persistenzeinheit festgelegt. Der Eigenschaftswert
ist eine Liste mit Tasknamen, Entitätstypen und Zugriffsartdefinitionen.
Das folgende Beispiel zeigt den Inhalt der Eigenschaft wsjpa.AccessIntent in einer Persistenzeinheit:
<property name = "wsjpa.AccessIntent"
value = "Tasks=' <taskName> { <entityName> ( <isolationLockValue> ) } ' "/>
A A A | | |
| | +--------- , --------+ | |
| +----------------- , -----------------+ |
+----------------------- , --------------------------+
Tasks ::= <task> [ ',' <task> ]*
<task> ::= <taskName> '{' <entity> [ ',' <entity> ]* '}'
<entity> ::= <entityName> '(' <isolationLockValues> ')'
<taskName> ::= <fully_qualified_identifier>
<entityName> ::= <fully_qualified_identifier>
<fully_qualified_identifier> ::= <identifier> [ '.' <Kennung> ]*
<identifier> ::= <idStartCharacter> [ <idCharacter> ]*
<idStartCharacter> ::= Character.isJavaIdentifierStart | '?' | '*'
<idStartCharacter> ::= Character.isJavaIdentifierPart | '?' | '*'
<isolationLockValues> ::= <isolationLockValue> [ ',' <isolationLockValue> ]
<isolationLockValue> ::= <isolation> | <readLock>
<isolation> ::= "isolation" '=' <isolationValue>
<readLock> ::= "readlock" '=' <readlockValue>
<isolationValue> ::= "read-uncommitted"|"read-committed"|"repeatable-read"|"serializable"
<readlockValue> ::= "read" | "write"
Beachten Sie Folgendes, bevor Sie den Tasknamen in einer Persistenzeinheit festlegen:
- Leerzeichen zwischen Token werden ignoriert.
- Nur beim Inhalt von <isolation> und <readLock> wird die Groß-/Kleinschreibung nicht beachtet.
- Der Taskname <TaskName> hat das Format eines vollständig qualifizierten Methodennamens für das Paket, z. B. "com.acme.bean.MyBean.increment", oder er ist ein beliebiger benutzerdefinierter Taskname, wie z. B. MyProfile.
- Der <entityName> hat das Format eines vollständig qualifizierten Klassennamens für das Paket, z. B. "com.acme.bean.Entity1".
- In den Elementen <TaskName> und <entityName> können die Platzhalterzeichen "?" und "*" verwendet werden. Das Zeichen "?" steht für ein einzelnes Zeichen, das Zeichen "*" für null oder mehr Sequenzzeichen.
- In einer Taskdefinition sind nur die Angaben für "hintNames isolation" und "readLock" zulässig. Die Reihenfolge ist nicht von Bedeutung.
- Wenn "readLock" den Wert write, dann muss "isolation" den Wert repeatable-read oder serializable haben.
- Wenn "readLock" den Wert read hat, hat diese Einstellung keine Wirkung, wenn "isolation" auf read-uncommitted gesetzt ist.
Das folgende Codebeispiel veranschaulicht, wie ein Taskname in einer
JPA-Persistenzeinheit festgelegt wird.
package my.company;
@Remote
class Ejb1 {
// Angenommen, es ist keine Transaktion des Callers vorhanden
@TransactionAttribute(Requires)
public void caller_Method1() {
// Start einer impliziten neuen Transaktion
// Tasknamen "my.company.Ejb1.caller_Method1" in TSR setzen
ejb1.callee_Method?();
}
@TransactionAttribute(RequiredNew)
public void callee_Method2() {
// Start einer neuen impliziten Transaktion, d. h. TxRequiredNew.
// Tasknamen "my.company.Ejb1.callee_Method2" in TSR setzen
}
@TransactionAttribute(Requires)
public void callee_Method3() {
// In Caller-Transaktion, somit bleibt der Taskname
// "my.company.Ejb1.caller_Method1"
}
@TransactionAttribute(NotSupported)
public void callee_LocalTx () {
// Nicht angegebene Transaktion, impliziter Start einer neuen lokalen Transaktion
// Tasknamen "my.company.Ejb1.callee_LocalTx" in TSR setzen
}
}
Da ein Platzhalterzeichen verwendet werden kann, um einen Tasknamen und einen Entitätstyp
anzugeben, können zur Laufzeit mehrere Spezifikationsübereinstimmungen gefunden werden.
Für die Suche nach Tasknamen und Entitätstypen wird die in der Eigenschaft wsjpa.AccessIntent definierte Reihenfolge verwendet.
<properties>
<property name="wsjpa.AccessIntent" value="Tasks="
*.Task1 { *.Employee1 ( isolation=read-uncommitted ),
*.Employee? ( isolation=repeatable-read, readlock=write ),
},
* { *.Employee3 ( isolation=serializable, readlock=write ) },
'" />
</properties>