2014-02-17 8 views
0

Cloud SQL에 지속하고자하는 Autor 클래스와 Dokument 클래스가 양방향 1 ~ n 목록 관계 (Autor가 여러 문서를 작성할 수 있음)에 있습니다. orm은 package.jdo 및 package-cloudsql.orm에 지정됩니다.JDO 양방향 일대 다 관계 추가 객체

Dokument 클래스 :

public class Autor { 

    private String aid; 

    private String vorname; 

    private String nachname; 

    private List<Dokument> dokumente; 

    public Autor() { 

    } 

    public Autor(String vorname, String nachname) { 
     this.vorname = vorname; 
     this.nachname = nachname; 
     this.dokumente = new ArrayList<Dokument>(); 
    } 

    public String getAID() { 
     return aid; 
    } 

    public String getVorname() { 
     return vorname; 
    } 

    public String getNachname() { 
     return nachname; 
    } 

    public List<Dokument> getDokumente() { 
     return this.dokumente; 
    } 

    public void setAID(String aid) { 
     this.aid = aid; 
    } 

    public void setVorname(String vorname) { 
     this.vorname = vorname; 
    } 

    public void setNachname(String nachname) { 
     this.nachname = nachname; 
    } 

    public void addDokument(Dokument dokument) { 
     this.dokumente.add(dokument); 
    } 

    public void deleteDokument(Dokument dokument) { 
     this.dokumente.remove(dokument); 
    } 

    public void deleteAllDokumente() { 
     this.dokumente.clear(); 
    } 

} 

Dokument 클래스 :

<class name="Autor" detachable="true" persistence-modifier="persistence-capable" table="Autor"> 
      <field name="aid" primary-key="true" persistence-modifier="persistent" value-strategy="identity"> 
       <column name="aid" jdbc-type="bigint" length="20"/> 
      </field> 
      <field name="vorname" persistence-modifier="persistent"> 
       <column name="vorname"/> 
      </field>  
      <field name="nachname" persistence-modifier="persistent"> 
       <column name="nachname"/> 
      </field> 
      <field name="dokumente" persistence-modifier="persistent" mapped-by="autor"> 
       <collection element-type="de.hdm.studienarbeit3.dokumente.Dokument"/> 
      </field> 
     </class> 
     <class name="Dokument" detachable="true" persistence-modifier="persistence-capable" table="Dokument"> 
      <field name="did" primary-key="true" persistence-modifier="persistent" value-strategy="identity"> 
       <column name="did" jdbc-type="bigint" length="20" /> 
      </field> 
      <field name="autor" persistence-modifier="persistent" default-fetch-group="true"> 
       <column name="autor" jdbc-type="bigint" length="20"/> 
       <foreign-key name="DOKUMENTAUTOR_FK" delete-action="restrict"/> 
      </field> 
      <field name="titel" persistence-modifier="persistent"> 
       <column name="titel"/> 
      </field> 
      <field name="text" persistence-modifier="persistent"> 
       <column name="text"/> 
      </field> 
      <field name="datum" persistence-modifier="persistent"> 
       <column name="datum"/> 
      </field> 
     </class> 
,536,913 :

<class name="Autor" detachable="true" identity-type="application"> 
      <field name="aid" primary-key="true" persistence-modifier="persistent" value-strategy="identity"/> 
      <field name="vorname"/> 
      <field name="nachname" /> 
      <field name="dokumente"/>  
     </class> 
     <class name="Dokument" detachable="true" identity-type="application"> 
      <field name="did" primary-key="true" persistence-modifier="persistent" value-strategy="identity"/> 
      <field name="autor"/> 
      <field name="titel"/> 
      <field name="text"/> 
      <field name="datum"/> 
     </class> 

패키지 sql.orm이 포함

public class Dokument { 

    private String did; 

    private Autor autor; 

    private String titel; 

    private String text; 

    private Date datum; 

    public Dokument() { 

    } 

    public Dokument(Autor autor, String titel, String text, Date datum) { 
     this.autor = autor; 
     this.titel = titel; 
     this.text = text; 
     this.datum = datum; 
    } 

    public Dokument(String titel, String text, Date datum) { 
     this.autor = null; 
     this.titel = titel; 
     this.text = text; 
     this.datum = datum; 
    } 

    public String getDid() { 
     return did; 
    } 

    public Autor getAutor() { 
     return autor; 
    } 

    public String getTitel() { 
     return titel; 
    } 

    public String getText() { 
     return text; 
    } 

    public Date getDatum() { 
     return datum; 
    } 

    public void setDID(String did) { 
     this.did = did; 
    } 

    public void setAutor(Autor autor) { 
     this.autor = autor; 
    } 

    public void setTitel(String titel) { 
     this.titel = titel; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public void setDatum(Date date) { 
     this.datum = date; 
    } 
} 

package.jdo이 포함

그래서 기존 Autor에 두 번째 (세 번째 등등) Dokument를 추가하고 싶습니다. 그러나 Dokument를 유지할 때마다 Autor i의 속성을 사용하여 새로운 Autor를 만듭니다. 예를 들어, ID 이름이 "Hans Maier"인 Autor가 있고 Autor로 그와 함께 다른 Dokument를 만들고 싶지만 새 dokument에는 ID가 2 인 Autor와 원하지 않는 "Hans Maier"이름이 있습니다. 나는 새로운 도큐먼트가 Autor 1과 연결되기를 바란다.

내 서블릿이 코드가 있습니다)

if (autoraid=="") { 
    if (vorname == "" | nachname =="") { 
    resp.getWriter().println("Bitte Autor auswählen oder Namen vollständig ausfüllen."); 
    } else { 
    Autor autor = new Autor(vorname, nachname); 
    Dokument dokument = new Dokument(autor, titel, text, datum); 
    autor.addDokument(dokument); 
    DokumentDAO dokumentDao = new DokumentDAO(pmf); 
    dokumentDao.addDokument(autor, dokument); 
} 
} else { 
    AutorDAO autorDao = new AutorDAO(pmf); 
    Autor autor = autorDao.getAutor(autoraid); 
    Dokument dokument = new Dokument(autor, titel, text, datum); 
    autor.addDokument(dokument); 
    DokumentDAO dokumentDao = new DokumentDAO(pmf); 
    dokumentDao.addDokument(autor, dokument); 
} 

autorDao.getAutor가 키 (이 작품)과 dokumentDao.addDokument (가 입수 한 autor을 반환은 pm.makePersistent에 주어진 dokument을 (지속 문서)

무엇이 잘못되었거나 잘못 되었습니까? Datanucleus 설명서에 List를 양방향 관계로 사용하는 경우 http://www.datanucleus.org/products/accessplatform/jdo/orm/relationships.html Dokument 작성자 및 autor.addDokument()에서 Autor를 설정하면서 수행중인 작업이 작동하지 않는 경우 양쪽 끝을 설정해야한다고 나와 있습니다.

지속성을 유지하기 전에 dokument.getAutor(). getAID()를 읽으면 연결하려는 Autor의 올바른 ID를 반환하지만 데이터베이스에 연결하려면 새로운 Autor입니다. 어떻게 제대로 작동시킬 수 있습니까?

는 나는이 http://www.onjava.com/pub/a/onjava/excerpt/chap_07/index2.html 및 createBook 방법은 정확히 내가 원하는 무엇을 읽고, 그래서 나는 또한 트랜잭션에

public void addDokument(Autor autor, Dokument dokument) { 

    PersistenceManager pm = pmf.getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 

    try { 

     tx.begin(); 
     dokument.setAutor(autor); 
     autor.addDokument(dokument);    
     pm.makePersistent(dokument); 

     tx.commit(); 

    } catch (Exception e) { 
     System.out.println("Exception: " + e.getMessage()); 

    } finally { 
     if (tx.isActive()) { 
     tx.rollback(); 
     } 
     pm.close(); 
    } 
    } 

을하고 테스트했지만 같은 결과는 새로운 Autor이 만들어집니다.

어떤 도움을 주시면 감사하겠습니다.

로그는 다음 말한다.

Feb 18, 2014 1:23:33 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalDateMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 
Feb 18, 2014 1:23:33 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalDateTimeMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 
Feb 18, 2014 1:23:33 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalTimeMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 
Feb 18, 2014 1:23:39 PM org.datanucleus.store.rdbms.query.ForwardQueryResult closingConnection 
Information: Reading in results for query "SELECT FROM de.hdm.studienarbeit3.dokumente.Autor ORDER BY nachname asc" since the connection used is closing 
Feb 18, 2014 1:23:52 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalDateMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 
Feb 18, 2014 1:23:52 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalDateTimeMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 
Feb 18, 2014 1:23:52 PM org.datanucleus.store.rdbms.mapping.MappedTypeManager addMappedType 
Schwerwiegend: User-defined type mapping class "org.datanucleus.store.mapped.mapping.LocalTimeMapping" was not found. Please check the mapping file class specifications and your CLASSPATH. The class must be in the CLASSPATH. 

org.datanucleus.store.mapped.mapping * (. 적어도 버전 3.1.3) datanucleus - 코어로 사용하지만 지금은 버전 3.2에서. 9. 더 이상 거기 있지 않니? 어디로 갔니? datanucleus-rdbms도 버전 3.2.9입니다. Google's compatibility doc

은 System.getProperty의 출력 ("java.class.path를")

[workspace]\studienarbeit3\war\WEB-INF\classes 
[workspace]\studienarbeit3\war\WEB-INF\lib\mysql-connector-java-5.1.28-bin.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\appengine-local-runtime-shared.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\el-api.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp\repackaged-appengine-ant-1.7.1.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp\repackaged-appengine-ant-launcher-1.7.1.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp\repackaged-appengine-jasper-6.0.29.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp\repackaged-appengine-jasper-el-6.0.29.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp\repackaged-appengine-tomcat-juli-6.0.29.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\jsp-api.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\shared\servlet-api.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\appengine-tools-api.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\appengine-api-labs\v1\appengine-api-labs.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\appengine-endpoints\v1\appengine-endpoints-deps.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\appengine-endpoints\v1\appengine-endpoints.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\jsr107\v1\appengine-jsr107cache-1.8.9.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\jsr107\v1\jsr107cache-1.1.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\user\appengine-api-1.0-sdk-1.8.9.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\asm-4.0.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\datanucleus-api-jdo-3.2.8.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\datanucleus-appengine-3.0.0.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\datanucleus-core-3.2.9.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\datanucleus-rdbms-3.2.9.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\jdo-api-3.1-rc1.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\opt\user\datanucleus\v3\jta-1.1.jar 
[workspace]\studienarbeit3\war\WEB-INF\lib\javax.servlet.jsp.jstl-1.2.1.jar 
[workspace]\studienarbeit3\war\WEB-INF\lib\javax.servlet.jsp.jstl-api-1.2.1.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\impl\google_sql.jar 
[eclipse]\plugins\com.google.appengine.eclipse.sdkbundle_1.8.9\appengine-java-sdk-1.8.9\lib\agent\appengine-agent.jar 
+0

"작동하지 않습니다." 그렇다면 정확하지 않은 이유는 무엇입니까? 그 통나무는 뭐라고하니? 그것은 객체 라이프 사이클 등을 알려주고, 상태 객체는 지속될 때 존재하며, 클래스 또는 정확한 퍼시스턴스 코드를 제공하지 않기 때문에 추측은 사람들이 남겨놓은 전부입니다. 로그는 그 상황을위한 것입니다. 그리고 돌아 오지 말고 "로그에 아무것도 없습니다"라고 말하면됩니다. 왜냐하면 디버그 레벨이 사용될 때 큰 파일이 될 것이기 때문입니다.) –

+0

나는 당신에게 로그를 제공하고 싶지만, 그것이 어디에 있는지 전혀 모른다. 내가 어디에서 찾을 수 있는지 말해 줄 수 있니? 여기에서 java.util.logging 예제를 복사했습니다. http://www.datanucleus.org/products/accessplatform/logging.html 그러나 출력을 찾을 수 없습니다. – Philipp

+0

클래스 및 DokumentDao.addDokument 코드를 추가했습니다. Autor autor, Dokument dokument) – Philipp

답변

0

은 (datanucleus-에서 appengine) 자신의 GAE/데이터 저장소 플러그인 DataNucleus 3.1와 호환 말한다.DataNucleus Maven repo에서 플러그인의 SVN (build)이 있습니다 (하지만 Google에 왜이 플러그인을 공개하기에는 너무 게을러지며 1 년 이상 SVN에있었습니다). 다른 기사에서는 Google Cloud SQL과 함께 사용하기 위해 DataNucleus 3.2 이상이 필요하다고 말합니다. 결론적으로, 왜 DataNucleus jar 버전을 혼합하고 매치 할 수 없는지는 명백합니다. 사용중인 버전을 선택하고 적절한 항아리를 가져옵니다.

+0

이 실제로 작동하지 않는 이유를 모르겠다. 나는이 Datanucleus-AppEngine-Plugin-3.0을 사용하고 있습니다. 내 buildpath에 Datanucleus 웹 사이트에서. – Philipp

+0

CLASSPATH에 실제로있는 모든 jar 버전 만 볼 수 있기 때문에 로그를 살펴보십시오. – DataNucleus

+0

WEB-INF/lib에있는 jar 목록을 추가했습니다. 누락되거나 오래된 버전이 없습니다 (아직 메이븐 저장소에 datanucleus-api-jdo-3.2.9.jar가 없습니다. accessplatform 3.3.7에는이 버전과 코어 및 rdbms 버전 3.2.9가 함께 제공됩니다.) – Philipp