Java JPA2.0 EntityManager是否尊重Google App Engine中的当前名称空间? 如何让JPA在生成键时尊重我正在设置的名称空间?
我使用以下代码获取当前用户,并将Java JPA2.0 EntityManager是否尊重Google App Engine中的当前名称空间? 如何让JPA在生成键时尊重我正在设置的名称空间?,java,google-app-engine,namespaces,jpa-2.0,entitymanager,Java,Google App Engine,Namespaces,Jpa 2.0,Entitymanager,我使用以下代码获取当前用户,并将名称空间设置为其用户ID: final OAuthService oauth = OAuthServiceFactory.getOAuthService(); final User user = oauth.getCurrentUser(); NamespaceManager.set(user.getUserId()); 当我执行以下操作时,我在日志中获得了正确的信息: System.out.println("user.getUserId() = " + use
名称空间设置为其用户ID
:
final OAuthService oauth = OAuthServiceFactory.getOAuthService();
final User user = oauth.getCurrentUser();
NamespaceManager.set(user.getUserId());
当我执行以下操作时,我在日志中获得了正确的信息:
System.out.println("user.getUserId() = " + user.getUserId());
System.out.println("user.toString() = " + user.toString());
下面是我如何在我的实体的构造函数中创建我的键的方法:
@Entity
public class ImageHandle
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize(using = com.vertigrated.gae.cms.jackson.KeySerializer.class)
@JsonDeserialize(using = com.vertigrated.gae.cms.jackson.KeyDeserializer.class)
private Key key;
....
我在构造函数中做的第一件事是:
this.key = KeyFactory.createKey(ImageHandle.class.getSimpleName(), uuid.toString());
Google App Engine文档指出,KeyFactory
应该使用当前NamespaceManager.get()
返回的任何内容,但它没有
当我执行以下代码并将命名空间设置为”
作为输出时,即使我已将其设置为上面代码中的user.getUserId()
:
final ImageHandle ir = new ImageHandle(fs.getBlobKey(aef), uuid, url, name, w, h, s);
ENTITY_MANAGER.persist(ir);
System.out.println("ir.getKey().getNamespace() = " + ir.getKey().getNamespace());
输出结果:ir.getKey().getNamespace()=
管理控制台中的数据存储查看器中也没有名称空间
Google App Engine中的JPA EntityManager是否尊重当前的名称空间设置?解决方案
我发现了问题所在,我正在调用另一个方法,在移动NamespaceManager.set(user.getUserId())后,将finally块中的名称空间设置为我的默认名称空间
代码>在该方法调用下面,它修复了它
吸取的教训
我应该获取当前的名称空间
,存储它,然后像示例一样将其设置回去。尊重名称空间设置吗?你在说什么?JPA将保存您的实体,只要它被正确设置和填充。它100%不知道谷歌应用程序引擎。如果包含ImageHandle
和Key
的实体代码,以及用于填充它们的代码,将非常有用。