JPA Table 生成问题
JPA Table generation problems
我在使用 JPA 时遇到问题。当我尝试保留一个新实体时,我会收到以下错误:
java.lang.IllegalArgumentException: Object: Technology is not a known
entity type.
技术是类别的标题class。 (注意:我的代码之前已经成功了!)所以我决定删除数据库中的所有表 (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 持久性服务 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException
内部异常:org.postgresql.util.PSQLException:错误:关系 "category" 不存在
位置:47
错误代码:0
调用:SELECT ID、DESCRIPTION、TITLE,PARENT_ID FROM category
查询:ReadAllQuery(referenceClass=Category sql="SELECT ID, DESCRIPTION, TITLE, PARENT_ID FROM category")
实体class (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();
}
}
如果你又遇到关系问题:
@ManyToOne
private A parent;
@OneToMany(mappedBy="parent")
private Collection<A> children;
对于 IllegalArgumentException,您能否向我们展示您调用 persist 并引发异常的部分代码?
在 persistence.xml 中将 transaction-type
更改为 LOCAL_RESOURCE
解决了问题并重新启动了 glassfish 服务器。
我在使用 JPA 时遇到问题。当我尝试保留一个新实体时,我会收到以下错误:
java.lang.IllegalArgumentException: Object: Technology is not a known entity type.
技术是类别的标题class。 (注意:我的代码之前已经成功了!)所以我决定删除数据库中的所有表 (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 持久性服务 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException
内部异常:org.postgresql.util.PSQLException:错误:关系 "category" 不存在
位置:47
错误代码:0
调用:SELECT ID、DESCRIPTION、TITLE,PARENT_ID FROM category
查询:ReadAllQuery(referenceClass=Category sql="SELECT ID, DESCRIPTION, TITLE, PARENT_ID FROM category")
实体class (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();
}
}
如果你又遇到关系问题:
@ManyToOne
private A parent;
@OneToMany(mappedBy="parent")
private Collection<A> children;
对于 IllegalArgumentException,您能否向我们展示您调用 persist 并引发异常的部分代码?
在 persistence.xml 中将 transaction-type
更改为 LOCAL_RESOURCE
解决了问题并重新启动了 glassfish 服务器。