2014-02-17 3 views
0

У меня есть класс Autor и класс Dokument, которые находятся в двунаправленном соотношении 1 к n (1 Autor может написать несколько документов), которые я хочу сохранить в Cloud SQL. Орма указано в 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 класс:

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 содержит следующее:

<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 содержит следующее:

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

Так что я хочу добавить второй (третий и т. Д.) Документ к существующему автору. Но каждый раз, когда я сохраняю Dokument, он также создает новый Autor с атрибутами Autor, которые я выбрал. Например, у меня есть Autor с именем id 1 «Hans Maier» и вы хотите создать с ним еще один документ с именем Autor, но у нового документа будет Autor с id 2, а также имя «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 возвращает Autor, который он получил по ключу (это работает) и dokumentDao.addDokument() сохраняется данное Dokument с pm.makePersistent (dokument)

Что мне не хватает или что-то не так? Документация Datanucleus говорит, что я должен установить оба конца при использовании List on двунаправленное отношение http://www.datanucleus.org/products/accessplatform/jdo/orm/relationships.html, что я делаю с настройкой Autor на создателя Dokument и autor.addDokument(), но это не работает.

Если я прочитал dokument.getAutor(). GetAID(), перед тем как продолжить, он вернет правильный идентификатор автора, к которому я хочу подключиться, но в базе данных это новый 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 * Раньше в DataNucleus-ядра (по крайней мере, в версии 3.1.3.), Но теперь в версии 3.2. 9. его больше нет? куда он пошел? datanucleus-rdbms также является версией 3.2.9.

Выход 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

«Это не работает». Так почему бы не быть точным? что говорит журнал? В нем рассказывается о жизненном цикле объекта и т. Д., Объекты состояния находятся при сохранении, и вы не предоставляете классы или точный код персистентности, поэтому догадки - это все, что осталось от людей. Журнал подходит именно для этой ситуации (и, пожалуйста, не возвращайтесь и не говорите «ничего в журнале», потому что это будет большой файл, когда используется уровень DEBUG). –

+0

Я хотел бы предоставить вам журнал, но я понятия не имею, где он находится. Можете ли вы сказать мне, где я могу его найти? Я скопировал пример java.util.logging здесь http://www.datanucleus.org/products/accessplatform/logging.html, но не смог найти выход – Philipp

+0

Я добавил классы и код DokumentDao.addDokument (Autor autor, Dokument dokument) – Philipp

ответ

0

Как Google's compatibility doc говорит, что их GAE/Datastore плагин (DataNucleus-AppEngine) совместима только с DataNucleus 3.1.Существует build SVN их плагина (который работает с DataNucleus 3.2/3.3) в репозитории DataNucleus Maven (но спросите Google, почему они слишком ленивы, чтобы опубликовать это, это было в их SVN в течение года или более). В вашей другой теме вам нужно DataNucleus 3.2+ для использования с Google Cloud SQL. В заключение, совершенно очевидно, почему вы не можете смешивать и сопоставлять версии DataNucleus jar; выберите версию, которую вы используете, и получите соответствующие банки.

+0

Я использую этот Datanucleus-AppEngine-Plugin-3.0. с веб-сайта Datanucleus в моем пути построения. – Philipp

+0

Так что смотрите в журнал, потому что только вы видите, какие версии всех этих банок находятся на самом деле в CLASSPATH. – DataNucleus

+0

Я добавил список баннеров, которые находятся в WEB-INF/lib, я не вижу там отсутствующих или устаревших версий (в репозиториях maven нет datanucleus-api-jdo-3.2.9.jar, accessplatform 3.3.7 также поставляется с этой версией, ядром и rdbms в версии 3.2.9.) – Philipp