解決策: この問題の回避策を考え出しました。私はシェルスクリプトを使用して私のメインクラスを走ったし、同じシェルスクリプトを使用してすべてのクラスを強化したところ、コードがあります。結合されたテーブルは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を使用しています私のファイルのレイヤ階層
である私のクラスです。 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つのテーブルのみが作成され、結合されたテーブルは作成されません。
これはこれは私がそれを理解することはできません取得していますエラーです
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
私はちょうど私が彼らに問い合わせることができるように結合された表が表示されるように取得しようとしています。結合されたテーブルが作成されない理由を誰かが指摘できれば幸いです。
既存のテーブルを削除しようとしましたが、OpenJPAでそれらを再作成しようとしましたか? – Rick
私は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)'が関連性があると思いますか? –
@rickはい、私はそれを試しました.. ntは動作しません。 –