Java 类在堆中的实例

Java 类在堆中的实例,java,jpa,eclipselink,classloader,Java,Jpa,Eclipselink,Classloader,我尝试基于spring框架和Eclipselink JPA创建一个简单的JPA应用程序 首先,初始化EntityManagerBean: public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntit

我尝试基于spring框架和Eclipselink JPA创建一个简单的JPA应用程序

首先,初始化EntityManagerBean:

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);