我有实体类“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();
请指导我缺少的地方。谢谢。
答案 0 :(得分:2)
如果使用JPA和GAE / Datastore要么使用所有JPA注释,要么全部作为供应商扩展使用所有JDO注释。你不能混合搭配。
答案 1 :(得分:0)
可能是您的数据库服务器未提供自动ID生成。
<强> IDENTITY 强>
IDENTITY
,它取决于数据库自动生成。 MySQL
或Microsoft SQL Server
在插入过程中为主键字段提供ID
代。常用方法是使用IdGeneratorStrategy.TABLE
。它不依赖于DB。
答案 2 :(得分:-1)
在我的情况下,问题出现在方法“containsUserMaster(usermaster)”中 方法检查存在方式如下:
UserMaster item = mgr.find(UserMaster.class, userId);
问题是,在添加操作未完成之前,userId将为null,并且因为程序因NullPointerExeption而停止。 我在null上添加userId checkinq - 这解决了问题