【问题标题】:Joined tables is not getting created in JPA?JPA 中没有创建连接表?
【发布时间】:2011-12-25 01:24:23
【问题描述】:

解决方案: 我已经找到了解决这个问题的方法。我使用 shell 脚本运行我的主类,我还使用相同的 shell 脚本增强了我的所有类,这里是代码。

#!/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

Instrument、InstrumentType、Laboratory、MedicalLaboratory 是我的课程。 我在我的 Instrument 类和未创建的 InstrumentType 类中创建了连接表/引用表。

我的 Instrument 类中有以下代码

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


    @ManyToMany(fetch=EAGER)
    @JoinTable(name="usedBy",
           joinColumns=@JoinColumn(name="instrument"),
           inverseJoinColumns=@JoinColumn(name="laboratory"))
    public Set<Laboratory> UsedBy;

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

我的 InstrumentType 类中有以下代码

@ElementCollection(fetch=EAGER)
    @Column(name="name")
    @CollectionTable(name="InstrumentName", joinColumns=@JoinColumn(name="type"))
    public Set<String> names;

这是输出,即我可以在我的 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 尝试重新创建它们?
  • 我从来没有使用过 OpenJPA,但看看这个:openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/… - 你认为 'buildSchema(ForeignKeys=true)' 可能与你的情况相关吗?
  • @rick 是的,我试过了.. 不起作用。

标签: java jakarta-ee jpa openjpa


【解决方案1】:

您当前遇到的问题在下面的异常行中指出:

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

您能否发布您拥有的完整映射类,以及您尝试映射的实体关系是什么?您可能应该首先构建一个没有 ER 字段的 ER 类,然后选择“最简单”的 ER 关系,然后映射它。从您的列表中不清楚,映射的是什么?

【讨论】:

  • 当我尝试使用 eclipse 增强器增强它时它不起作用,但是当我使用命令行增强它时它起作用
  • 问题在于 Eclipse 内置增强器
  • @YeshwanthVenkatesh 那么,这个问题解决了吗? “eclipse内置增强器”是什么意思?
  • 我已经粘贴了我用来运行我的 java 程序的 shell 脚本。我以这种方式增强了我的课程,而不是使用 eclipse 内置的增强器,您可以从开放的 jpa 站点下载它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2011-04-29
  • 2021-10-03
  • 2017-04-04
相关资源
最近更新 更多