当前位置: 首页 > 知识库问答 >
问题:

如何将JPA实体与PersistenceUnits关联

蓟雪峰
2023-03-14

我有两个persistenceUnits映射到两个不同的Oracle模式,这些模式是相似的,但表名不同。当我尝试部署应用程序时,我得到一个Hibernate异常“Missing table”,这似乎是Hibernate在错误的PersistenceUnit中查找表。

.ear#POIPersistenceUnit\“:org.hibernate.hibernateException:丢失表:POI_SERVICE原因:org.hibernate.hibernateException:丢失表:POI_SERVICE”}}

表“POI_Service”属于“POIExtractorPersistenceUnit”persistenceUnit而不是“POIPersistenceUnit”persistenceUnit

我尝试在persistence.xml文件中列出具有相应persistenceUnits的实体,如下所示,但没有成功,仍然得到相同的错误。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

<persistence-unit name="POIExtractorPersistenceUnit">

    <jta-data-source>java:/XAPOIExtractorDS</jta-data-source>

    <class>za.co.fnb.cii.poiextractor.persistence.model.IdentificationRequest</class>
    <class>za.co.fnb.cii.poiextractor.persistence.model.IdentificationResponse</class>
    <class>za.co.fnb.cii.poiextractor.persistence.model.POIService</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.archive.autodetection" value="class" />
        <property name="hibernate.flushMode" value="FLUSH_AUTO" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.show_sql" value="true" />

    </properties>

</persistence-unit>

<persistence-unit name="POIPersistenceUnit">

    <jta-data-source>java:/XACompendiumDS</jta-data-source>

    <class>za.co.fnb.cii.poiextractor.persistence.entities.IdentificationRequestIncoming</class>
    <class>za.co.fnb.cii.poiextractor.persistence.entities.IdentificationResponseIncoming</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.archive.autodetection" value="class" />
        <property name="hibernate.flushMode" value="FLUSH_AUTO" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.show_sql" value="false" />

    </properties>

</persistence-unit>

我还尝试如下方式对实体进行注释@PersistenceUnit(unitName=“PoIExtractorPersistenceUnit”),但仍然没有成功,错误仍然存在。

/**
 * Created by on 21-Dec-15.
 */
@Entity
@Table(name = "POI_SERVICE")
@PersistenceUnit(unitName = "POIExtractorPersistenceUnit")
@NamedQueries({
        @NamedQuery(name="findServiceRecordByApplicationName",
                query="SELECT pois FROM POIService pois WHERE pois.application = :applicationName")
})
public class POIService implements IEntity{

    @Id
    @GeneratedValue(generator="service_config_seq")
    @SequenceGenerator(name="service_config_seq", sequenceName="service_config_seq", allocationSize=1)
    private long id;

    private String application;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_update",nullable = false)
    private Date lastUpdate;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_date",nullable = true)
    private Date lastDate;

    @Column(name = "last_record",nullable = true)
    private long lastRecord;

    @Override
    public long getId() {
        return id;
    }

    public String getApplication() {
        return application;
    }

    public void setApplication(String application) {
        this.application = application;
    }

    public Date getLastUpdate() {
        return lastUpdate;
    }

    public void setLastUpdate(Date lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public Date getLastDate() {
        return lastDate;
    }

    public void setLastDate(Date lastDate) {
        this.lastDate = lastDate;
    }

    public long getLastRecord() {
        return lastRecord;
    }

    public void setLastRecord(long lastRecord) {
        this.lastRecord = lastRecord;
    }
}

更新:

堆栈跟踪

更新2:当我从persistence.xml中移除这个属性时,一切正常。

<property name="hibernate.hbm2ddl.auto" value="validate" />

共有1个答案

单喜
2023-03-14

一个JPAEntityManager属于一个持久性单元,或者EntityManagerFactory,您不能将多个持久性单元与同一个EntityManager混合使用。

但你不必那么做。

您可以有一个单一的持久性单元,并在映射实体时使用schema属性。

 类似资料:
  • 问题内容: 我有一个java.sql.Blob的JPA实体: 如何创建该实体的实例?我想设置与方法,但如何让从JPA?只是接口,对于不同的数据库有不同的实现,因此我认为JPA应该给我正确的实现。如何获得? 问题答案: 使用字节数组: 如果要使用流,请使用以下命令创建Blob:

  • 我正在使用Postgres10.8、Java8和Spring Boot2.1.9 with Data JPA来映射我的实体和我的数据库表。在我的数据库中,我对表进行了分区,并使用了继承策略。 我的结构是这样的: 我的实体: 我认为问题可能是由于将数据重定向到子表中插入的触发器引起的,而Spring data不识别它。 有办法修好吗?

  • 我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体:

  • 问题内容: 我有两个实体,它在哪里取决于表中的另一个外键。 我要完成的工作是拥有一个in,这样每当我有一个实体对象时,我都可以从语言ID访问所有描述。 实体 Car.java 实体 CarDescription.java 实体 语言.java 我遇到的问题是映射为我提供了从到的映射。 如何完成正确的映射? 问题答案: 在您需要添加属性: 然后,您可以像这样在实体中使用它:

  • 对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新

  • 我已经在数据库中保存了一个JPA实体。 我想拥有它的副本(具有不同的id),并修改了一些字段。 最简单的方法是什么?例如: 将它的字段设置为并持久化它会起作用吗? 我是否必须为实体创建一个克隆方法(复制除之外的所有字段)? 还有其他方法吗(比如使用克隆框架)?