【问题标题】:Primary key is not generated in JPA with app engine Java使用应用程序引擎 Java 在 JPA 中未生成主键
【发布时间】:2014-03-05 11:39:23
【问题描述】:

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

实体类:

@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;
    }

安卓客户端

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();

请指导我在我缺乏的地方。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,你是对的。我正在混合 JPA 和 JDO,但现在我只使用 JPA,但它也不起作用。我编辑了我的代码。
    • 但是“不工作”并不能真正告诉我们太多。该日志将告诉您很多关于发送到数据存储区的内容(并且您也没有提供实际的 JPA 持久性代码)。 persist 之后的对象将有一个 id(无论是 0 还是其他值),您也可以将其打印出来。但是在调试 LOG 时应该是您的第一个调用点
    • 如果我不设置userId 那么它不会在数据库中插入记录,我不想以编程方式设置我的 id。我希望它应该是自动生成的。我已经发布了我从 android 客户端使用的实体持久代码。
    • 我说的是 JPA 持久化代码,它可能被这个 EndPoint 的东西隐藏了,但归根结底,这里没有人知道它在调用什么。如前所述,LOG 是您应该查看的位置(当您将其设置为 IDENTITY 时)。
    【解决方案2】:

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

    身份

    • IDENTITY,它依赖于数据库自动生成。
    • 某些 DB 服务器,如 MySQLMicrosoft SQL Server 确实在插入期间为主键字段提供 ID 生成。

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

    【讨论】:

      【解决方案3】:

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

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

      在添加操作未完成之前,userId 将为 null 的问题,并且由于程序以 NullPointerExeption 停止.. 我在 null 上添加 userId checkinq - 这解决了问题

      【讨论】:

        猜你喜欢
        • 2011-08-17
        • 1970-01-01
        • 2011-07-10
        • 2012-06-18
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多