我在处理项目时遇到了一种奇怪的行为(Google Cloud Endpoints + Datanucleus JPA)。
我想使用KeyFactory.createKeyString(String kind, String name)
方法维护无主实体的ID,但在对这些ID执行查询时会出现奇怪的行为。
Parent.java
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Unowned
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Child child;
// constructors, getters and setters
}
Child.java
@Entity
public class Child {
@Id
private String id;
@Basic(fetch = FetchType.EAGER)
private String name;
public Child() {}
public Child(String name) {
this.name = name;
this.id = KeyFactory.createKeyString("Child", name);
//this.id = id.substring(0, id.length() - 1); // magic line!
}
// getters and setters
}
JPQL查询:"select p from Parent p join p.child c where c.id = :childId"
现在问题如下:
*如果魔术线被注释掉,我总是从查询中得到一个空列表
*如果魔术线未被注释,一切都很完美。
有关信息:生成的ID通常约为40到50个字符,并且是HTML安全的(仅限字母数字)。以下是使用KeyFactory方法生成的ID的示例:agR0ZXN0chALEgZBcnRpc3QiBERhbGkM
有人可以解释这种奇怪的行为吗?
更新:
我甚至尝试用id = id + "a";
或任何其他角色替换魔术线,这也是有效的。这意味着它绝对不是尺寸限制问题。