Not known Entity

Looky

Erfahrenes Mitglied
Hallo Leute,

Ich möchte JPA mit Spring benutzen. Allerdings komme ich immer auf einen Fehler der mich echt wahnsinnig macht. Ist sicher nur eine kleinigkeit.

Die Fehlermeldung:
java.lang.IllegalArgumentException: Object: de.ckel.dbmodel.Person@52e80740 is not a known entity type.

Hier meine Person-Entity:
PHP:
package de.ckel.dbmodel;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	private int id;
	private String name;
	private String adress;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAdd() {
		return adress;
	}
	public void setAdd(String adress) {
		this.adress = adress;
	}
}

Hier die Spring Config:
PHP:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
    default-autowire="byName">
           

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/jpa2"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
  </bean>
	
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="books" />
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
        <property name="showSql" value="false"/>
         <property name="generateDdl" value="false"/> 
        <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform"/>
      </bean>
    </property>  
	        <property name="loadTimeWeaver">
	            <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />
	        </property>    
  </bean>



 	<context:annotation-config />
	<context:component-scan base-package="de"/>
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
</beans>
und finally hier die persitence.xml aus dem Verz. META-INF:

PHP:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
	  <persistence-unit name="books" transaction-type="RESOURCE_LOCAL">
	  <class>de.ckel.dbmodel.Person</class>
	  </persistence-unit>
	</persistence>

Ich hab gegooglet wie ein wahnsinniger und bin mit meinem Latein echt am Ende.

Hier ein Testcase, der den Fehler bringt (beim em.persist(person)

Test:
PHP:
RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:springtest.xml"})
public class Test {
	
	@Autowired
	GetCon con;
	
	@org.junit.Test
	public void test(){
		System.out.println(con);
		con.setup();
	}
...

und GetCon
PHP:
public class GetCon implements IOrderService{

	EntityManager em;
	
	@PersistenceContext
	public void setEM(EntityManager em){
		this.em = em;
	}
	
	public void setup(){
		System.out.println("SETUP");
			Person p = new Person();
			p.setAdd("Akdwpqokdo99");
			p.setName("Testname");
			em.persist(p);
			
		}


Vielen Dank!!
 
Also, das Problem war offensichtlich der LoadTimeWeaver. Wenn ich den auf InstrumentationLoadTimeWeaver ändere, gehts. Dummerweise muss ich nun immer das javaagent vm-argument aufrufen. gibt es da keine andere möglichkeit, sodass ich die Konfig bei beidem, meinem JUnit-Test UND Tomcat nutzen kann?

Danke euch
Christian
 
es gibt ne andere möglichkeit.

eclipselink.weaving

vielen dank für eure unglaubliche hilfe ^^
 
Hallo,

musst du unbedingt Load-Time Weaving verwenden? Ich verwende einfach component-scanning mit einem angepassten PersistenceUnitPostProcessor den ich an LocalContainerEntityManagerFactoryBean->persistenceUnitPostProcessors konfiguriere um Entities über mehrere Projekte hinweg zu registrieren...

Java:
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {

  @Getter
  @Setter
  protected String basePackage = "de.tutorials.app";


  @Override
  public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
    ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
    provider.addIncludeFilter(new AnnotationTypeFilter(Entity.class));

    Set<BeanDefinition> candidates = provider.findCandidateComponents(basePackage);

    for (BeanDefinition bd : candidates) {
      pui.getManagedClassNames().add(bd.getBeanClassName());
    }
  }

}

Damit startet die Anwendung immer noch schneller als mit Load-Time Weaving.
Siehe auch hier:
http://www.tutorials.de/java/356059...k-junit-4-und-maven-2-x.html?highlight=Lombok

Gruß Tom
 
Zurück