Java GAE数据存储使用JPA生成字符串密钥
因为不可能只使用长ID,所以我尝试使用生成的字符串键。我有三个类Java GAE数据存储使用JPA生成字符串密钥,java,google-app-engine,jpa,google-cloud-datastore,Java,Google App Engine,Jpa,Google Cloud Datastore,因为不可能只使用长ID,所以我尝试使用生成的字符串键。我有三个类User,Topic,Comments,其中User-1:n-Topic-1:n-Comments 课堂评论: @Entity public class Comment implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Extension(vendorName = "datanucleus", k
User
,Topic
,Comments
,其中User
-1:n-Topic
-1:n-Comments
课堂评论:
@Entity
public class Comment implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@ManyToOne
private User author;
@ManyToOne
private Topic topic;
@Entity
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@Unique
private String username;
@Entity
public class Topic implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;
@ManyToOne(cascade = CascadeType.ALL)
private User author;
@OneToMany(cascade = CascadeType.ALL)
private List<Comment> comments;
类用户:
@Entity
public class Comment implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@ManyToOne
private User author;
@ManyToOne
private Topic topic;
@Entity
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@Unique
private String username;
@Entity
public class Topic implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;
@ManyToOne(cascade = CascadeType.ALL)
private User author;
@OneToMany(cascade = CascadeType.ALL)
private List<Comment> comments;
课程主题:
@Entity
public class Comment implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@ManyToOne
private User author;
@ManyToOne
private Topic topic;
@Entity
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;
@Unique
private String username;
@Entity
public class Topic implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;
@ManyToOne(cascade = CascadeType.ALL)
private User author;
@OneToMany(cascade = CascadeType.ALL)
private List<Comment> comments;
是否可以在不手动使用KeyFactory的情况下生成字符串ID?如果是,我的代码有什么问题
谢谢我使用
表格生成器
。无论您想要什么id样式,它都很有用。比方说,即使您希望获得Group
id,比如GRP000001
和GRP0000500
等。。
您必须在实体中使用属性注入,而不是字段注入。它基于setter ID方法。如果EntityManager
generate生成的id为201,则EntityManager将在setter注入中调用setId()。如果是,id将是GRP0000201
我的例子是:
@Entity
@TableGenerator(name = "GROUP_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME",
valueColumnName = "GEN_VAL", pkColumnValue = "GROUP_GEN", allocationSize = 1)
@Access(value = AccessType.FIELD)
public class Group implements Serializable {
@Transient
private String id;
private String name;
//name getter and setter
public void setId(String id) {
if(id != null) {
this.id = Utils.formatId(id, "GRP", 10);
}
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "GROUP_GEN")
@Access(value = AccessType.PROPERTY)
public String getId() {
return id;
}
}
Utils.java
public class Utils {
/**
* E.g.
* Input: id=523, prefix="AAA", maxLength=15
* Output: AAA000000000523
*/
public static String formatId(String id, String prefix, int maxLength) {
if (!id.startsWith(prefix)) {
int length = id.length() + prefix.length();
for (; (maxLength - length) > 0; length++) {
id = '0' + id;
}
id = prefix + id;
}
return id;
}
}
IIRC身份策略是生成数字(或密钥)ID。
如果您使用的是JDO,那么可以使用自动生成的UUID样式的ID。
看