Eclipselink-93异常说明:该描述符中不存在表[item]



我最近对JPA应用程序进行了一些更改,该应用程序运行良好一年左右。我添加了几个新桌子,遇到了一些问题。我无法发布我的架构图像,因为我没有10个帖子,但是我有一个项目表和一个产品表。许多产品可以具有相同的项目,因此产品表具有item_id

以下是我的项目实体

@Entity
@Table(name="item")
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Integer _id;
private Double carbonValue;
private String description;
private String name;
private Integer discount;
@OneToMany(mappedBy="item")
private Collection<Product> products;
// getters and setters etc

这是我的产品实体

@Entity
@Table(name="product")
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Integer _id;
private Integer deleted;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ITEM_ID", referencedColumnName="_ID")
private Item item;
@ManyToOne(fetch = FetchType.LAZY)  
@JoinColumn(name="SUPPLIER_ID", referencedColumnName="_ID")
private Supplier supplier;
@OneToMany(mappedBy = "product")
private Collection<Consumption> consumptions;

我正在使用Eclipselink 2.2

当我在项目表上运行查询时,如下所示:

public final static String SELECT_ALL_ENTITIES_SQL = "SELECT o FROM Item AS o";
public List<Item> getAllEntities() {
        final EntityManager entityManager = DaoUtils.getEntityManagerFactory().createEntityManager();
        final List<Item> items;
        try {
            items = (List<Item>) entityManager.createQuery(SELECT_ALL_ENTITIES_SQL).getResultList();
        } finally {
            entityManager.close();
        }
        return items;
    }

我有以下错误:

 [EL Info]: 2012-10-24 14:16:23.798--ServerSession(1351669994)--EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913
[EL Severe]: 2012-10-24 14:16:24.16--ServerSession(1351669994)--Local Exception Stack: 
Exception [EclipseLink-0] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions: 
---------------------------------------------------------
Exception [EclipseLink-93] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [item] is not present in this descriptor.
Descriptor: RelationalDescriptor(database.entities.Product --> [DatabaseTable(product)])
Exception [EclipseLink-93] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [circle] is not present in this descriptor.
Descriptor: RelationalDescriptor(database.entities.Refund --> [DatabaseTable(refund)])
Runtime Exceptions: 
---------------------------------------------------------
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:476)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:407)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:680)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:628)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:233)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:394)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:185)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:242)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:230)
    at database.dao.ItemDao.getAllEntities(ItemDao.java:24)
    at database.dao.ItemDao.main(ItemDao.java:19)
Descriptor Exceptions: 
---------------------------------------------------------

Local Exception Stack: 
Exception [EclipseLink-93] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The table [item] is not present in this descriptor.
Descriptor: RelationalDescriptor(database.entities.Product --> [DatabaseTable(product)])
    at org.eclipse.persistence.exceptions.DescriptorException.tableNotPresent(DescriptorException.java:1628)
    at org.eclipse.persistence.descriptors.ClassDescriptor.getTable(ClassDescriptor.java:2478)
    at org.eclipse.persistence.descriptors.ClassDescriptor.buildField(ClassDescriptor.java:760)
    at org.eclipse.persistence.descriptors.ClassDescriptor.buildField(ClassDescriptor.java:749)
    at org.eclipse.persistence.mappings.OneToManyMapping.initializeTargetForeignKeysToSourceKeys(OneToManyMapping.java:796)
    at org.eclipse.persistence.mappings.OneToManyMapping.initializeReferenceDescriptor(OneToManyMapping.java:726)
    at org.eclipse.persistence.mappings.ForeignReferenceMapping.initialize(ForeignReferenceMapping.java:1160)
    at org.eclipse.persistence.mappings.CollectionMapping.initialize(CollectionMapping.java:1095)
    at org.eclipse.persistence.mappings.OneToManyMapping.initialize(OneToManyMapping.java:466)
    at org.eclipse.persistence.descriptors.ClassDescriptor.initialize(ClassDescriptor.java:2744)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:453)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:407)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:680)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:628)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:233)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:394)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:185)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:242)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:230)
    at database.dao.ItemDao.getAllEntities(ItemDao.java:24)
    at database.dao.ItemDao.main(ItemDao.java:19)

我在这里做错了什么?

更新:在数据库上,我删除了产品和项目之间的关系。在我的代码中,我还删除了两个实体之间的任何引用,因此现在数据库表和实体根本没有关系。而且我仍然会遇到相同的错误????

已解决:当我在另一个无关的实体中编码我的实体时,我会赞扬将产品贴上产品。我现在把头撞在桌子上。

不要使用 @PrimaryKeyJoinColumn。通常,它使用JPA Inheritance。使用@JoinColumn annotation

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ITEM_ID", referencedColumnName="ID")
private Item item;

Supplier也是相同的。

更新:这是EclipseLink的问题。错误282571

尝试按以下方式修复:

@Entity
@Table(name="product")
@SecondaryTable(name="item", pkJoinColumns=@PrimaryKeyJoinColumn(name="_ID"))
public class Product implements Serializable {
}

根据您的错误日志:

Exception Description: The table [circle] is not present in this descriptor.
Descriptor: RelationalDescriptor(database.entities.Refund --> [DatabaseTable(refund)])

您需要在Refund实体中使用SecondaryTable的CC_6注释。

如果 Item不需要对产品所属的明确知识,则不需要mappedByProduct表中的@JoinColumn拥有此关系,并且有意义地将项目的明确知识放在这里。

也要以下内容:

编辑行

@OneToMany(mappedBy="item")
private Collection<Product> products;

@OneToMany
private Collection<Product> products;

或更好的仍然

@OneToMany(fetch = FetchType.LAZY)
private Collection<Product> products;

最新更新