У меня есть два сопоставления 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
Я попытался перечислить сущности с соответствующими единицами persistenceUnits в файле persistence.xml следующим образом, но безуспешно, по-прежнему получаю ту же ошибку.
<?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>
I have also tried to annotate the entities as follows @PersistenceUnit(unitName = "POIExtractorPersistenceUnit")
but still no luck, the error is still there.
/**
* 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, все работает нормально.
JPA
принадлежит одной единице сохранения состояния, или<?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; } }
Но тебе не нужно этого делать.
<property name="hibernate.hbm2ddl.auto" value="validate" />