Java 类在堆中的实例
我尝试基于spring框架和Eclipselink JPA创建一个简单的JPA应用程序 首先,初始化EntityManagerBean:Java 类在堆中的实例,java,jpa,eclipselink,classloader,Java,Jpa,Eclipselink,Classloader,我尝试基于spring框架和Eclipselink JPA创建一个简单的JPA应用程序 首先,初始化EntityManagerBean: public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntit
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setJpaDialect(new EclipseLinkJpaDialect());
EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();
vendorAdapter.setShowSql(true);
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setDatabasePlatform("org.eclipse.persistence.platform.database.PostgreSQLPlatform");
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan("org.egzi.diplom.model");
entityManagerFactoryBean.setLoadTimeWeaver(new SimpleLoadTimeWeaver());
//to update existing table (alter table)+
Properties additionalProperties = new Properties();
additionalProperties.setProperty("eclipselink.ddl-generation", "create-or-extend-tables");
additionalProperties.setProperty("eclipselink.ddl-generation.output-mode","database");
entityManagerFactoryBean.setJpaProperties(additionalProperties);
return entityManagerFactoryBean;
}
在DAO类中,请尝试保留某些实体:
@PersistenceContext
EntityManager entityManager;
@Transactional(propagation = Propagation.REQUIRED)
public void createTODO() {
Todo todo = new Todo();
todo.setSummary("a");
todo.setDescription("b");
entityManager.persist(todo);
}
和实体类:
@Entity
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String summary;
private String description;
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Todo [summary=" + summary + ", description=" + description
+ "]";
}
}
但当我运行这样的代码时,我有一个例外:
java.lang.IllegalArgumentException: Object: Todo [summary=a, description=b] is not a known entity type.
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4228)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:262)
at com.sun.proxy.$Proxy22.persist(Unknown Source)
at org.egzi.diplom.spring.GeneratorImpl.createTODO(GeneratorImpl.java:59)
当我查看eclipselink源代码时,会发现类作为键的HashMap:
org.eclipse.persistence.internal.sessions.AbstractSession.getDescriptor(类):
当我开始调试代码时,我发现描述符映射已经有一个Todo.class键。我发现HashMap和Todo.class中类的identityHash是不同的。我从Inteliji的想法开始编写代码
我的例子有什么不对
更新:
发现描述符HashMap中的类在org.springframework.instrument.classloading上有一个链接。SimpleInstrumentableClassLoader@14bb2297
但我的待办事项对象还有一个:
sun.misc.Launcher$AppClassLoader@58644d46尝试为字段ID添加getter和setter 通过设置另一个LoadTimeWeaver修复异常-InstrumentationLoadTimeWeaver和异常已消失仍有相同的异常hm,请尝试在@entity之后添加@Table(name=“yourName”)!我已经试过了。请注意我在主要部分的最后更新。看起来类加载器有问题。。。
descriptor = this.descriptors.get(theClass);