ich eine einfache Anwendung mit In Memory HSQLDB entwickelt habe und es läuft in Websphere Freiheit 8.5 über Windows-Profil. Jetzt habe ich solche Anwendung in Websphere über z/OS390 Mainframe (Unix) veröffentlicht und ich bekomme den Fehler unten.Fehler beim Erstellen der Bohne EntityManagerFactory, NoSuchMethodError: javax/Ausdauer/Table.indexes
Soweit es zu verstehen ist, sollte es nicht durch das Betriebssystem beeinflusst werden, da es das gleiche jar (hsqldb-2.3.2.jar), dieselbe JDK-Version (7) und genau dieselbe myapp.ear-Datei ist.
Also, meine direkte Frage ist: Was könnte der Grund für "NoSuchMethodError: javax/persistence/Table.indexes" während EntityManagerFactory Erstellung sein?
Was mein Leben schwerer zu machen, ist, dass genau das gleiche Ohr in meinem lokalen Websphere Einsatz nicht einen solchen Fehler nicht auftauchen. Eine indirekte Frage könnte sein, ist irgendeinen Trick im Speicher HSQLDB unter Unix zu machen? Lies ich die Logs falsch und dieser Fehler wird in der Tat durch eine falsche Spring-Konfiguration verursacht? Ich denke nicht, weil genau dasselbe Ohr in einer anderen Websphere läuft, wie gesagt.
Ich habe für 4 Tage zu kämpfen einen möglichen Grund zu finden, aber ich konnte nicht. Jeder Vorschlag wird sehr geschätzt.
Fehlerprotokolle:
WebSphere non-WLM Dispatch Thread t=009bb7a0¨ ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory'
defined in myapp.config.root.TestConfiguration: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()ÝLjavax/persistence/Index;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java
TestConfiguration.java
@Configuration
@EnableTransactionManagement
public class TestConfiguration {
@Bean(initMethod = "init")
public TestDataInitializer initTestData() {
return new TestDataInitializer();
}
@Bean(name = "datasource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(org.hsqldb.jdbcDriver.class.getName());
dataSource.setUrl("jdbc:hsqldb:mem:mydb");
dataSource.setUsername("sa");
dataSource.setPassword("jdbc:hsqldb:mem:mydb");
System.out.println("Untill here was printed without error");
return dataSource;
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DriverManagerDataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setPackagesToScan(new String[]{"myapp.model"});
entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
Map<String, Object> jpaProperties = new HashMap<String, Object>();
jpaProperties.put("hibernate.hbm2ddl.auto", "create");
jpaProperties.put("hibernate.show_sql", "true");
jpaProperties.put("hibernate.format_sql", "true");
jpaProperties.put("hibernate.use_sql_comments", "true");
entityManagerFactoryBean.setJpaPropertyMap(jpaProperties);
System.out.println("Untill here was printed without error also");
return entityManagerFactoryBean;
}
}
TestDataInitializer
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
@Component
public class TestDataInitializer {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
AnotherModelRepository anotherModelRepository;
public void init() throws Exception {
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
… few session.persit(mymodel)…
POM:
<properties>
<java-version>1.7</java-version>
<org.springframework-version>4.1.3.RELEASE</org.springframework-version>
<spring-security-version>3.2.5.RELEASE</spring-security-version>
<hibernate.version>4.3.7.Final</hibernate.version>
<org.slf4j-version>1.6.1</org.slf4j-version>
<jackson-version>2.4.4</jackson-version>
<postgres.driver.version>9.3-1100-jdbc41</postgres.driver.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgres.driver.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Spring security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>com.allanditzel</groupId>
<artifactId>spring-security-csrf-token-filter</artifactId>
<version>1.1</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- Jackson JSON Processor -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<!-- servlet container provided dependencies -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.30</version>
<scope>provided</scope>
</dependency>
<!-- test dependencies -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>0.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
<build>
<finalName>my-app</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
**** Hinzugefügt in 28. August 2016 02.45 Uhr Brasilien, São Paulo Zeitzone Dank der hervorragenden Antworten zur Verfügung gestellt, ich finaly meine Anwendung in Windows Websphere 8.5 Liberty-Profil wie in Mainframe z/OS390 Websphere ND 8.5 ausgeführt haben. Ich habe hier meine Lösung für zukünftige Leser hinzugefügt. Der grundlegende Trick war (1), um Hibernate Herabstufung JPA2 verwenden und EntityManager.getDelegate()
@Component
public class TestDataInitializer {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
AnotherModelRepository anotherModelRepository;
// I TOOK @PersistenceContext OUT
/* @PersistenceContext
private EntityManager em;*/
public void init() throws Exception {
// I REPLACED entityManagerFactory.unwrap AND sessionFactory.openSession OUT
//SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
//Session session = sessionFactory.openSession();
// BY createEntityManager AND getDelegate
EntityManager em = entityManagerFactory.createEntityManager();
Session session = (Session) em.getDelegate();
Transaction transaction = session.beginTransaction();
…
@Repository
public class MyModelRepository {
/* @PersistenceContext
private EntityManager em;*/
@Autowired
private EntityManagerFactory entityManagerFactory;
public MyModel findMyModelById(Long MyModel) {
EntityManager em = entityManagerFactory.createEntityManager();
List<MyModel> MyModels = em.createNamedQuery(MyModel.FIND_BY_ID, MyModel.class).setParameter("MyModelId", MyModel).getResultList();
return MyModels.size() == 1 ? MyModels.get(0) : null;
}
public List<MyModel> findOutByIn(Integer certainId){
//SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
EntityManager em = entityManagerFactory.createEntityManager();
Session session = (Session) em.getDelegate();
String query = "select c from … c "
+ " inner join … o "
+ " where …;
//Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
List<MyModel> l = session.createQuery(query).list();
return l;
}
versuchte ich hibernate.version 4.2.21, aber ich habe jetzt diese Fehlermeldung: „Die Methode unwrap (Klasse) für den Typ EntityManagerFactory nicht definiert ist“. Was schlägst du mir vor? In wenigen Worten, ich möchte den folgenden Code auf Hibernate <4.3.x mit JPA 2.0 anpassen: "public void init() löst Exception {SessionFactory sessionFactory = entityManagerFactory.unwrap (SessionFactory.class); ..." Ich denke ich gerade muss "unwrap" in ??? ändern Methode. P.S. Ich las über Alternativen Websphere laufen mit JPA2.1 zu machen, aber ich ziehe mein Glas statt Herabstufung etwas in dem Unternehmen websphere –
unwrap() -Methode möglicherweise nicht verfügbar mit Hibernate-JPA-2.0-api-1.0.1 jar ändern. Eine andere Möglichkeit, ein Session-Objekt zu erhalten, ist die EntityManager.getDelegate() -Methode.Bitte prüfe hier http://stackoverflow.com/questions/4148231/how-can-i-get-the-session-object-if-i-have-the-entitymanager – abaghel
Als letzten Kritiker habe ich meine Lösung oben und hinzugefügt Ich frage mich, ob es wirklich eine gute Übung ist, da ich @Autowired EntityManagerFactory habe, aber ich habe die EntityManager-Implementierung über "entityManagerFactory.createEntityManager()" erstellt. Sie können von oben bemerken, dass ich "@PersistenceContext private EntityManager em" herausgenommen und "entityManagerFactory.createEntityManager()" hinzugefügt habe, wo immer ich die Session brauche. Nun, ich kann Ihnen sagen, dass es funktioniert, aber es klingt nicht komisch, dass ich die Factory autowired habe und ich eine "create" -Methode für die echte Implementierung verwendet habe? –