使用app engine Java在JPA中不生成主键

时间:2014-03-05 11:39:23

标签: java android google-app-engine jpa google-cloud-datastore

我有实体类“User”,如下所示,但它没有生成主键。我在我的应用引擎应用中使用JPA并在我的Android客户端中使用应用引擎端点。

Enitty class:

@Entity
public class UserMaster {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;

    private String userName;
    private String fullName;
    private String userAvtarUrl;
    private String userAbout;
    private String userGender;


    public String getUserName() {
        return userName;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getUserAvtarUrl() {
        return userAvtarUrl;
    }

    public void setUserAvtarUrl(String userAvtarUrl) {
        this.userAvtarUrl = userAvtarUrl;
    }

    public String getUserAbout() {
        return userAbout;
    }

    public void setUserAbout(String userAbout) {
        this.userAbout = userAbout;
    }

    public String getUserGender() {
        return userGender;
    }

    public void setUserGender(String userGender) {
        this.userGender = userGender;
    }
}

端点持久性代码:

@ApiMethod(name = "insertUserMaster")
    public UserMaster insertUserMaster(UserMaster usermaster) {
        EntityManager mgr = getEntityManager();
        try {
            if (containsUserMaster(usermaster)) {
                throw new EntityExistsException("Object already exists");
            }
            mgr.persist(usermaster);
        } finally {
            mgr.close();
        }
        return usermaster;
    }

Android客户端

Userendpoint.Builder builder = new Userendpoint.Builder(
                        AndroidHttp.newCompatibleTransport(),
                        new JacksonFactory(), new HttpRequestInitializer() {
                            public void initialize(HttpRequest httpRequest) {
                            }
                        });

                Userendpoint endpoint = CloudEndpointUtils.updateBuilder(
                        builder).build();

                User objUser = new User();

                objUser.setUserName(txtName.getText().toString());
                objUser.setUserEmail(txtEmail.getText().toString());

                Bitmap bmp = BitmapFactory.decodeFile(imagePath);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
                byte[] imgByte = out.toByteArray();
                String encodedImage = Base64.encodeToString(imgByte,
                        Base64.DEFAULT);
                objUser.setImage(encodedImage);

                User result = endpoint.insertUser(objUser).execute();

请指导我缺少的地方。谢谢。

3 个答案:

答案 0 :(得分:2)

如果使用JPA和GAE / Datastore要么使用所有JPA注释,要么全部作为供应商扩展使用所有JDO注释。你不能混合搭配。

答案 1 :(得分:0)

可能是您的数据库服务器未提供自动ID生成。

<强> IDENTITY

  • IDENTITY,它取决于数据库自动生成。
  • 某些数据库服务器,MySQLMicrosoft SQL Server在插入过程中为主键字段提供ID代。

常用方法是使用IdGeneratorStrategy.TABLE。它不依赖于DB。

答案 2 :(得分:-1)

在我的情况下,问题出现在方法“containsUserMaster(usermaster)”中 方法检查存在方式如下:

UserMaster item = mgr.find(UserMaster.class, userId);

问题是,在添加操作未完成之前,userId将为null,并且因为程序因NullPointerExeption而停止。 我在null上添加userId checkinq - 这解决了问题