RESTful サービスを作成しようとしています。マルチテナンシーのために、@AdditionalCriteria アノテーションを適用しています。ただし、 @OneToOne アノテーションを使用してエンティティに参加すると、次の例外が発生します。
Exception [EclipseLink-6174] (Eclipse Persistence Services - 2.3.0.v20110604-
r9504): org.eclipse.persistence.exceptions.QueryException
Exception Description: No value was provided for the session property
[SECURITYID]. This exception is possible when using additional criteria or
tenant discriminator columns without specifying the associated contextual
property. These properties must be set through Entity Manager, Entity Manager
Factory or persistence unit properties. If using native EclipseLink, these
properties should be set directly on the session.
Query: ReadObjectQuery(name="readObject" referenceClass=Addresses
sql="SELECT id, city, country, postalcode, province, security_id, street
FROM addresses WHERE ((id = ?) AND (security_id = ?))")
プロパティ [SECURITYID] を EntityManager レベルで設定し、結合なしですべて正常に動作します。しかし、@OneToOne を使用してエンティティに参加すると、プロパティが存在しないことがわかります。これが私が何か間違ったことをしたことが原因なのか、それともバグなのかを判断するのに十分な経験がありません。私には、結合されたエンティティを取得するために別の EntityManager が使用されているように見えます。しかし、私の知識不足のため推測です。また、EntityManagerFactory レベルでプロパティを設定しようとしましたが、役に立ちませんでした。
これが私のセットアップです。実在物:
@Entity
@AdditionalCriteria("this.securityId=:SECURITYID")
@Table(name = "tasks", catalog = "catalog", schema = "schema")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Tasks.findAll", query = "SELECT t FROM Tasks t")
})
public class Tasks implements Serializable
{
...
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="service_address_id")
private Addresses serviceAddress;
...
}
RESTFacade クラス
@Stateless
@Path("tasks")
public class TasksFacadeREST extends AbstractFacade<Tasks>
{
@PersistenceContext(unitName = "UnitName")
private EntityManager em;
...
@java.lang.Override
protected EntityManager getEntityManager()
{
// Temp! REMOVE WHEN DONE
sessionId = "123456789";
Identifier.setIdentity(em,sessionId);
em.setProperty("SECURITYID",Identifier.securityId);
em.setProperty("USERID",Identifier.userId);
return em;
}
ありがとう、Rgds、M