我正在使用 Hibernate 开发一个简单的示例,在任何容器之外使用它。我正在使用 Maven,因此配置了 JBoss 存储库(请参阅https://community.jboss.org/wiki/MavenGettingStarted-Users)并将以下依赖项添加到我的项目的 POM 中:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.0.CR1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.170</version>
</dependency>
然后我继续配置 Hibernate 以使用这样的 H2 数据库(文件 hibernate.cfg.xml):
<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration">
<session-factory>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
最后,我为一个简单的联系人类创建了一个 POJO,如下所示:
@Entity
public class Contact {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
private String name;
@Basic
private String email;
/* Getters and setters omitted for brevity. */
}
最后,我创建了一个获取会话工厂、会话并最终持久化实体的类。代码如下:
ServiceRegistry registry = new ServiceRegistryBuilder().configure().buildServiceRegistry();
MetadataSources sources = new MetadataSources(registry);
sources.addAnnotatedClass(Contact.class);
Metadata metadata = sources.buildMetadata();
sessionFactory = metadata.buildSessionFactory();
Contact contact = new Contact();
/* Set some attributes. */
Session session = sessionFactory.openSession();
session.save(contact);
session.close();
当我运行此代码时,这就是我得到的:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/jandex/Indexer
at org.hibernate.metamodel.source.annotations.AnnotationMetadataSourceProcessorImpl.prepare(AnnotationMetadataSourceProcessorImpl.java:78)
at org.hibernate.metamodel.source.internal.MetadataImpl.prepare(MetadataImpl.java:177)
at org.hibernate.metamodel.source.internal.MetadataImpl.<init>(MetadataImpl.java:162)
at org.hibernate.metamodel.source.internal.MetadataBuilderImpl.buildMetadata(MetadataBuilderImpl.java:83)
at org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:112)
调查org.hibernate/hibernate-core
我添加到项目中的依赖项的 POM,我可以看到它依赖于org.jboss/jandex 1.0.3.Final
. 满足这种依赖性,我现在得到了一个NoClassDefFoundError: com/fasterxml/classmate/TypeResolver
. 回到 Hibernate 的 POM,它依赖于com.fasterxml/classmate 0.5.4
. 在我的项目中也满足了这种依赖关系,我终于能够在没有任何NoClassDefFoundError
s 的情况下执行代码。
在 Hibernate 的 POM 中,jandex 和 classmate 都被定义为test
依赖项,这就是为什么 Maven 的传递依赖解析功能不会将它们自动添加到我的项目中的原因。但是,为什么在我运行简单代码时需要它们?我究竟做错了什么?
在此先感谢您的任何指点。- 维托