Especificando TaskName em uma Unidade de Persistência JPA
Especificando um TaskName na unidade de persistência Java™ Persistence API (JPA)
Sobre Esta Tarefa
Um TaskName é definido no arquivo persistence.xml usando o nome de propriedade wsjpa.AccessIntent em uma unidade de persistência. O valor da propriedade é uma lista de TaskNames, tipos de entidades e definições de intenção de acesso. O seguinte exemplo mostra o conteúdo do nome de propriedade wsjpa.AccessIntent em uma unidade de persistência.
<nome da propriedade = "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> [ '.' <identifier> ]*
<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"
Antes de configurar o TaskName em uma unidade de persistência, mantenha em mente:- Espaços em branco que são ignorados entre tokens.
- Apenas os conteúdos <isolation> e <readLock> não fazem distinção entre maiúsculas e minúsculas.
- <TaskName> está no formato de um nome de método de pacote completo, como com.acme.bean.MyBean.increment, ou um nome da tarefa arbitrário definido pelo usuário, como MyProfile.
- <entityName> está no formato de um nome de classe de pacote completo, como com.acme.bean.Entity1.
- Os caracteres curingas '?' ou '*' podem ser usados em <TaskName> e <entityName>. "?" corresponde a qualquer caractere exclusivo e "*" corresponde a zero ou mais caracteres de sequência.
- Somente isolamento de hintNames e readLock são permitidos em uma definição de tarefa e a ordem não é significante
- Se readLock tiver o valor write, isolation deverá ser repeatable-read ou serializable
- Se readLock tiver o valor read, não terá efeito se isolation for read-uncommitted.
O seguinte exemplo de código mostra como especificar um TaskName na unidade de persistência
JPA.
package my.company;
@Remote
class Ejb1 {
// nenhum tx do responsável pela chamada
@TransactionAttribute(Requires)
public void caller_Method1() {
// uma nova transação implícita inicia
// TaskName "my.company.Ejb1.caller_Method1" configurado em TSR
ejb1.callee_Method?();
}
@TransactionAttribute(RequiredNew)
public void callee_Method2() {
// uma nova transação implícita inicia, por exemplo, TxRequiredNew.
// TaskName "my.company.Ejb1.callee_Method2" configurado em TSR
}
@TransactionAttribute(Requires)
public void callee_Method3() {
// Na transação do responsável pela chamada, portanto, TaskName permanece
// "my.company.Ejb1.caller_Method1"
}
@TransactionAttribute(NotSupported)
public void callee_LocalTx () {
// Transação não especificada, uma nova transação local implicitamente iniciada.
// TaskName "my.company.Ejb1.callee_LocalTx" configurado em TSR
}
}
Como um curinga pode ser usado para especificar TaskName e o tipo de entidade, várias correspondências de especificações podem ocorrer no tempo de execução.
A ordem definida na propriedade wsjpa.AccessIntent será usada para procurar por nomes de tarefas e tipos de entidades.
<properties>
<property name="wsjpa.AccessIntent" value="Tasks="
*.Task1 { *.Employee1 ( isolation=read-uncommitted ),
*.Employee? ( isolation=repeatable-read, readlock=write ),
},
* { *.Employee3 ( isolation=serializable, readlock=write ) },
'" />
</properties>