2011-11-09 7 views
2

解決策: この問題の回避策を考え出しました。私はシェルスクリプトを使用して私のメインクラスを走ったし、同じシェルスクリプトを使用してすべてのクラスを強化したところ、コードがあります。結合されたテーブルはJPAで作成されていませんか?

#!/bin/sh 
# 
# Compile and Run the OpenJPA test program 
# 
cp=. 
cp=$cp:lib/mysql-connector-java.jar 
cp=$cp:lib/openjpa-2.0.1.jar 
cp=$cp:lib/commons-lang-2.1.jar 
cp=$cp:lib/geronimo-jta_1.1_spec-1.1.1.jar 
cp=$cp:lib/serp-1.13.1.jar 
cp=$cp:lib/commons-collections-3.2.1.jar 
cp=$cp:lib/geronimo-jpa_2.0_spec-1.1.jar 
# 
echo "Compiling" 
javac -cp $cp *.java */*.java 
echo "Enhancing" 
java -cp $cp org.apache.openjpa.enhance.PCEnhancer nu/InstrumentType.java nu/Instrument.java nu/Laboratory.java nu/MedicalLaboratory.java 
echo "Running" 
java -cp $cp test 

あなたはNUを見ることができるように私のパッケージ名で、強化する必要が私のクラスはテストが私のメインクラスです/ が続いています。 私は知っていませんが、エンハンサー作品に組み込まれたecpliseを使用する代わりに、この方法を強化しています。

QUESTION : 

これは私がOpenJPAの

インストゥルメント、InstrumentType、研究所、MedicalLaboratoryを使用しています私のファイルのレイヤ階層

This is my file layer hierarchy

である私のクラスです。 InstrumentクラスとInstrumentTypeクラスの中で、作成されていない結合テーブル/参照テーブルを作成しました。

私は私のインストゥルメント・クラス内に次のコードを持って、私はこれは私が見ることができる午前テーブルすなわち出力がある

@ElementCollection(fetch=EAGER) 
    @Column(name="name") 
    @CollectionTable(name="InstrumentName", [email protected](name="type")) 
    public Set<String> names; 

私InstrumentTypeクラス内に次のコードを持っている

@ManyToOne 
    @JoinColumn(name="type", nullable=false) 
    public InstrumentType type; 


    @ManyToMany(fetch=EAGER) 
    @JoinTable(name="usedBy", 
      [email protected](name="instrument"), 
      inverse[email protected](name="laboratory")) 
    public Set<Laboratory> UsedBy; 

public void setUsedBy(Set<Laboratory> UsedBy) { 
    this.UsedBy = UsedBy; 
    } 

私のNavicat。表示されているように、4つのテーブルのみが作成され、結合されたテーブルは作成されません。

enter image description here

これはこれは私がそれを理解することはできません取得していますエラーです

public class main { 

    @SuppressWarnings("unchecked") 
    public static void main(String[] args) { 

    // Create the new objects to be persisted. 
    Instrument i = new Instrument(); 
    InstrumentType it = new InstrumentType(); 
    Laboratory l = new Laboratory(); 
    MedicalLaboratory ml = new MedicalLaboratory(); 


    // Configure and create the factory. 
    java.util.Map<Object,Object> map = new java.util.HashMap<Object,Object>(); 
    map.put("openjpa.ConnectionUserName", "root"); 
    map.put("openjpa.ConnectionPassword", "root"); 
    map.put("openjpa.ConnectionURL", "jdbc:mysql://127.0.0.1:3306/test123"); 
    map.put("openjpa.ConnectionDriverName", "com.mysql.jdbc.Driver"); 
    map.put("openjpa.jdbc.SynchronizeMappings", "buildSchema"); 
     EntityManagerFactory factory = Persistence.createEntityManagerFactory("test123", map); 

     // Create a new EntityManager from the EntityManagerFactory. The 
     // EntityManager is the main object in the persistence API, and is 
     // used to create, delete, and query objects, as well as access 
     // the current transaction 
     EntityManager em = factory.createEntityManager(); 

     // Begin a new local transaction so that we can persist a new entity 
     em.getTransaction().begin(); 

     // Create and persist a new Message entity 
     em.persist(i); 
     em.persist(it); 
     em.persist(l); 
     em.persist(ml); 


     // Commit the transaction, which will cause the entity to 
     // be stored in the database 
     em.getTransaction().commit(); 

     // It is always good practice to close the EntityManager so that 
     // resources are conserved. 
     em.close(); 
     factory.close(); 

} 
} 

私のメインクラスです。

73 test123 INFO [main] openjpa.Runtime - Starting OpenJPA 2.0.1 
164 test123 INFO [main] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.MySQLDictionary". 
Exception in thread "main" <openjpa-2.0.1-r422266:989424 fatal store error> org.apache.openjpa.persistence.RollbackException: null 
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:584) 
    at nu.main.main(main.java:50) 
Caused by: <openjpa-2.0.1-r422266:989424 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null 
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1963) 
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) 
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479) 
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925) 
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:560) 
    ... 1 more 
Caused by: java.lang.IllegalArgumentException 
    at nu.MedicalLaboratory.pcProvideField(MedicalLaboratory.java) 
    at org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:3135) 
    at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2956) 
    at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:40) 
    at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1047) 
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2077) 
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037) 
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1955) 
    ... 5 more 

私はちょうど私が彼らに問い合わせることができるように結合された表が表示されるように取得しようとしています。結合されたテーブルが作成されない理由を誰かが指摘できれば幸いです。

+1

既存のテーブルを削除しようとしましたが、OpenJPAでそれらを再作成しようとしましたか? – Rick

+1

私はOpenJPAを一度も使用していませんが、これを見ています:http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_mappinghtml#ref_guide_mapping_synch - あなたのケースでは、 'buildSchema(ForeignKeys = true)'が関連性があると思いますか? –

+0

@rickはい、私はそれを試しました.. ntは動作しません。 –

答えて

1

あなたが現在抱えている問題は、以下の例外のラインで指摘されています

at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:560) 
    ... 1 more 
Caused by: java.lang.IllegalArgumentException 
    at nu.MedicalLaboratory.pcProvideField(MedicalLaboratory.java) 

あなたが持っている完全なマッピングクラスを投稿することができ、また、あなたがマップしようとしているエンティティの関係は何ですか?おそらく最初に1つのERクラスを構築し、ERフィールドがない場合は、「最も単純な」ER関係を選択し、次にそのマッピングを行うべきです。それはあなたのリストからはっきりしていない、何がマップされていますか?

+0

エクリプスエンハンサーを使ってエンハンサーを強化しようとすると、エンハンサーが機能しませんが、コマンドラインを使ってエンハンストすると –

+0

エンハンサーに組み込まれたエクリプスの問題でした –

+0

@YeshwanthVenkateshので、この問題は解決しましたか? 「エクリプスエンハンサー」は何を意味しますか? –

関連する問題