您何时在Objectify中注册GAE课程?

Bra*_*don 16 java google-app-engine objectify

所以这可能是一个愚蠢的问题,但你什么时候注册类:

ObjectifyService.register( User.class );
Run Code Online (Sandbox Code Playgroud)

目前,我在类似接口的类的构造函数中这样做,我在其他类中使用它来简化数据存储的使用,特别是我的应用程序.但是,我收到此错误:

尝试两次注册"用户"

所以,我想我的问题是你在Objectify中注册课程的频率和具体时间是多少?

谢谢!

PS这是我的全班:

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Iterator;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.persistence.Id;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.annotation.Indexed;
import com.googlecode.objectify.annotation.Unindexed;

public class UsersService {

    Objectify ojy;

    public UsersService(){
        ObjectifyService.register( User.class );
        ojy = ObjectifyService.begin();
    }

    public void regUser(String email, String password, String firstName, String lastName){
        //TODO: Check syntax if email
        //TODO: store encrypted password
    }

    public void regUser(String email, String password, String firstName){
        regUser(email, password, firstName, null);
    }

    public void regUser(String email, String password){
        regUser(email, password, "", "");
    }

    public boolean checkFor(Long acc_id){
        User checked_user = ojy.find(User.class, acc_id);
        if(checked_user == null){
            return false;
        }else{
            return true;
        }
    }

    public User getUser(String email, String password) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException{
        String pass_enc = MyUtils.getEncrypted(password);
        Iterable<User> users = ojy.query(User.class).filter("email", email).filter("password", pass_enc);
        Iterator<User> iter = users.iterator();
        if(iter.hasNext()){
            return iter.next();
        }else{
            return null;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 23

更新

这是最佳实践解决方案:

使用您自己的服务,这可以保证您的实体在使用Objectify之前已注册,但不一定会影响应用程序启动以查看不访问数据存储区的请求.

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;


public class OfyService {
    static {
        ObjectifyService.register(User.class);
    }

    public static Objectify ofy() {
        return ObjectifyService.begin();//prior to v.4.0 use .begin() , 
                                        //since v.4.0  use ObjectifyService.ofy();
    }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

public User createUser(User pUser) {

    Objectify objectify = OfyService.ofy();
    objectify.put(pUser);

    return pUser;
}
Run Code Online (Sandbox Code Playgroud)

原始答案(更好地使用上面的代码):

你应该在你的班级这样做,只需要像这样放一个静态块:

static{
    ObjectifyService.register( User.class );
}
Run Code Online (Sandbox Code Playgroud)

ps,你也看看物化的最佳实践

http://code.google.com/p/objectify-appengine/wiki/BestPractices