【问题标题】:JPA Table generation problemsJPA 表生成问题
【发布时间】:2015-10-29 09:24:59
【问题描述】:

我在使用 JPA 时遇到问题。当我尝试持久化一个新实体时,我会收到以下错误:

java.lang.IllegalArgumentException: Object: Technology is not a known 实体类型。

Technology 是 Category 类的标题。 (注意:我的代码以前工作过!)所以我决定删除数据库中的所有表(PostgreSql)

N̶o̶w̶̶I̶̶h̶a̶v̶e̶̶t̶h̶e̶̶f̶o̶l̶l̶o̶w̶i̶n̶g̶̶e̶r̶r̶o̶r̶:̶

(我之前遇到过这个错误,但过了一会儿就消失了)
javax.persistence.PersistenceException: 异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 内部异常:org.postgresql.util.PSQLException:错误:关系“类别”不存在 职位:47 错误代码:0 调用:SELECT ID、DESCRIPTION、TITLE、PARENT_ID FROM category 查询:ReadAllQuery(referenceClass=Category sql="SELECT ID, DESCRIPTION, TITLE, PARENT_ID FROM category")

实体类(Category.Java)

@Entity
public class Category implements DataObject, Serializable {

@Id
@GeneratedValue 
private Long id;
private String title;
private String description;

@ManyToOne @JsonIgnore 
private Category parent;

@Transient
private Long parentId;
//functions
}

persistence.xml

  <persistence-unit name="BloggerPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>blogdb</jta-data-source>
    <class>domain.Blog</class>
    <class>domain.BlogUser</class>
    <class>domain.Category</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
  </persistence-unit>

编辑

我通过重新启动 glassfish 服务器解决了关系错误。 现在我又回到了第一个错误。

DatabaseJPA.java

public class DatabaseJPA<T extends DataObject> implements Database<T> {

private EntityManagerFactory factory;
private EntityManager manager;
private Class<T> type;

public DatabaseJPA(String name, Class<T> type)
{
      factory = Persistence.createEntityManagerFactory(name);
      manager = factory.createEntityManager();
      this.type = type;
}
@Override
public T ReadValue(long id) {

   return (T) manager.find(type, id);
}

@Override
public void InsertValue(T value) {


    manager.getTransaction().begin();

    manager.persist(value);

    manager.flush();
    manager.getTransaction().commit();

}

@Override
public void UpdateValue(long id, T value) {
    manager.getTransaction().begin();
    manager.merge(value);
    manager.flush();
    manager.getTransaction().commit();
}


@Override
public void DeleteValue(long id) {
    manager.getTransaction().begin();
    manager.remove(this.ReadValue(id));
    manager.flush();
    manager.getTransaction().commit();
}

@Override
public void close() throws IOException {
    factory.close();
    manager.close();
}
}

【问题讨论】:

  • 好吧,也许我不明白一些东西,但是如果您的数据库中没有任何表,那么如果您的名为 category 的表不存在,那么当您调用 select from category 时您期望什么?
  • 是的,但是 JPA 应该根据实体的属性自动生成表
  • 你能说明你是如何尝试持久化导致问题的实体吗?
  • 我已经添加了我的数据库类
  • 好的,现在向我们展示您是如何尝试调用您的 InsertValue 方法的 - 您在那里传递的内容。

标签: java hibernate postgresql jpa eclipselink


【解决方案1】:

如果你再次遇到关系问题:

@ManyToOne
private A parent;
@OneToMany(mappedBy="parent")
private Collection<A> children;

对于 IllegalArgumentException,您能否向我们展示您调用persist 并引发异常的部分代码?

【讨论】:

  • 这个属性应该在启动时创建数据库表
  • 您在使用 jpa 2.1 我在您的 persistence.xml 中看不到它吗?您应该在 中有“version='2.1'”
  • 是的,我有持久性标签,只是没有包含它,我只在我的问题中包含了持久性单元
  • 那么您使用的是什么版本的 JPA?
  • 我使用的是 2.1 版
【解决方案2】:

将 persistence.xml 中的 transaction-type 更改为 LOCAL_RESOURCE 解决了该问题并重新启动 glassfish 服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多