0

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では、その年が永続的であることがわかります。しかし、私はそれらを取得することはできません。または、stud.getAnnualReport()は常に空です。

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

私は本当に何をすべきかわかりません。スタッドとAnnualReportの関係は次のとおりです

スタッド

@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;

どうなるかわかりません。すでに永続化されているマップ情報を取得できないのはなぜですか?

4

1 に答える 1

0

期待した結果が得られない理由はわかりませんが、デバッグ情報は表示されません。ログを使用して永続化プロセスを簡単にたどることができ、GAE Entity オブジェクトに実際に何が永続化されているかがわかります。GAE には、 http: //code.google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/jdo/JDOMapTest.java に (JDO) 単体テストがあり ます。

これは正しい動作を示しています (また、JDO/JPA は永続化エンジンの単なるラッパーであるため、JPA を使用しても同じことが正常に永続化されないと考える理由はありません)。

編集: 実際、 http: //code.google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/jpa/JPAMapTest.java に JPA マップのテストを追加しました。そして正常に動作します。

于 2012-10-24T15:00:03.917 に答える