如何在GAE中持久化JPA中的Map

时间:2012-10-24 09:03:51

标签: google-app-engine jpa map persistent

我不知道为什么我不能在GAE的JPA中持久化MAP

AnnualReport thatyear = ....... 
if (stud.getAnnualReport() == null){
            Map<Integer,AnnualReport> temp = new HashMap<Integer,AnnualReport>();
            temp.put(thatyear.getAttrKey(), thatyear);
            stud.setAnnualReport(temp);
        } else{
            Map<Integer,AnnualReport> temp2 = stud.getAnnualReport();
            temp2.put(thatyear.getAttrKey(), thatyear);
            stud.setAnnualReport(temp2);
        }

        em.getTransaction().begin();
        try {
            em.persist(stud);
            em.getTransaction().commit();
        } finally {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
        }

实际上在http:// localhost:8888 / _ah / admin / datastore中我可以看到thatyear一直存在;但是,我永远无法得到它们;或者,stud.getAnnualReport()始终为空。

EntityManager em;
em = EMF.get().createEntityManager();
AnnualReport thatyear = stud.getAnnualReport().get(yearselected);

我真的不知道该怎么办。以下是Stud&amp; amp;的关系。年报

螺柱

@Entity( name = "Stud")
public class Stud{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key studID;

private String lastName = new String();

private Map<Integer,AnnualReport>annualReport = new HashMap<Integer,AnnualReport>(20);
@OneToMany(mappedBy="stud",cascade = CascadeType.ALL) 
@MapKey(name = "attrKey") 
@Basic
public Map<Integer, AnnualReport> getAnnualReport() {

        return annualReport;

}

年报

@Entity( name = "AnnualReport")
public class AnnualReport  implements Serializable{
private static final long serialVersionUID = 3581307841164176872L;  
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key annualReportID;

public int attrKey;
@ManyToOne 
Stud stud; 

private String attendSchoolNote;

我不知道会发生什么。为什么我不能获得那些已经持久的地图信息?

1 个答案:

答案 0 :(得分:0)

不知道为什么你没有得到预期的结果,但是你没有提供调试信息。您可以使用日志轻松地遵循持久性过程,告诉您实际持久存储到GAE实体对象中的内容。 GAE有一个(JDO)单元测试 http://code.google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/jdo/JDOMapTest.java

演示了正确的行为(并且由于JDO / JPA只是持久性引擎的包装器,因此没有理由认为使用JPA不会持续存在)。

编辑:事实上我刚刚在http://code.google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/jpa/JPAMapTest.java添加了JPA地图的测试,并且工作正常。