我有两个模型,Book和Chapter,以一对多的关系。我手动创建Book和Chapter的键。为了坚持,我创建了一个书籍对象,然后向其添加章节实例,然后坚持书。这很好,因为我在数据存储区中看到它们。现在,当我尝试按键从数据存储区中获取章节时,我得到一个空对象。
以下是密钥在数据存储区中的显示方式:
Under Book: name/id = 123 chapters = [Book(123)/Chapter("abc")]
Under Chapter: name/id = abc
我创建了我的密钥,用于创建和获取对象,使用
Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), chapterId);
我的提取代码是:
Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), chapterId);
Chapter chp = mgr.find(Chapter.class, key);//chp is always null (yes in debug mode as well)
更新:
我在Book上尝试同样的事情并且它工作正常。所以问题在于章节。也许是因为我通过Book保存了章节(但我在上面提到的数据存储区中看到了这两个)。
所以问题是:有没有办法独立检索章节(通过它的键),如果是,请提供代码片段。
更新源代码:
@Entity
public class Book implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Chapter> Chapters = new ArrayList<Chapter>();
public List<Chapter> getChapters() {
return Chapters;
}
public void setChapters(List<Chapter> Chapters) {
this.Chapters = Chapters;
}
public Book(long num, List<Chapter> Chapters) {
super();
Key key = KeyFactory.createKey(Book.class.getSimpleName(), num);
this.key = key;
this.Chapters = Chapters;
}
public Book(long num) {
super();
Key key = KeyFactory.createKey(Book.class.getSimpleName(), num);
this.key = key;
}
public Book() {
}
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
}
@Entity
public class Chapter implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String content;
public Chapter(String ChapterId, String content) {
super();
Key key = KeyFactory.createKey(Chapter.class.getSimpleName(), ChapterId);
this.key = key;
this.content = content;
}
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
public String getContent() {
return content;
}
public void set content(String content) {
this.content = content;
}
}
添加代码:
Book bk = new Book(num);
Chapter chp = new Chapter(ChapterId, content);
bk.getChapters().add(chp);
bookDao.put(bk);
mgr.persist(bk);
答案 0 :(得分:1)
我没有留下任何投票,但你应该提供更多的周围代码。在您给出的代码中,事情看起来很好,但如果您在事务中创建了书/章(未显示),则该章可能将该书指定为父项,并且您在手动时未指定父项创建章节键。
答案 1 :(得分:0)
您必须始终包含父实体密钥以检索子实体。 以下是如何创建包含父级的键:
Key keyBook = KeyFactory.createKey(Book.class.getSimpleName(),
BOOK_ID);
Key keyChapter = KeyFactory.createKey(keyBook,
Chapter.class.getSimpleName(), CHAPTER_ID);
Chapter chp = mgr.find(Chapter.class, keyChapter);
希望这会有所帮助。