0

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

4

2 に答える 2

1

参考までに、無効にするプロパティはeclipselink.cache.shared.default

<property name="eclipselink.cache.shared.default" value="false"/>
于 2014-11-03T11:40:13.963 に答える
1

私の推測では、これはキャッシングに関連しています。

Normally the tenant property would be set on the EntityManagerFactory, not the EntityManager. This would mean you have a different EntityManagerFactory for each tenant. You could also define the tenant property in your persistence.xml and have a different persistence unit per tenant.

If you need to set the tenant per EntityManager, then you need to disable the shared cache, or setting the cache mode to protected.

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Single-Table_Multi-Tenancy#Setting_Properties_and_Caching_Scope

于 2012-04-30T13:45:14.843 に答える