我正在尝试使用休眠注释测试一些POJO,但不断遇到相同的错误。我在另一个项目中使用相同的配置,一切正常。我测试了测试 hib 对象时使用的 jdbc 连接 - 并且连接工作正常。
我发现了一些关于同一错误的其他问题,但没有任何帮助。
使用 main 方法测试类中的代码:
public static void main(String[] args) {
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Item.class)
.buildSessionFactory();
//create session
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
List<Item> items = session.createQuery("from items").list();
带有休眠注释的 POJO:
@Entity
@Table(name="items")
public class Item {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="price")
private double price;
@Column(name="stock")
private int stock;
public Item() {
}
public Item(String name, double price) {
this.name = name;
this.price = price;
}
下面是每个实体的获取者和设置者。
文件休眠.cfg.xml与另一个项目中的相同文件具有相同的配置,其中连接和休眠代码工作得很好 - 正如所写的 abobe,连接在单独的类中进行了测试。
我正在使用的罐子(全部添加到类路径(:
- antlr-2.7.7.jar字节伙伴-1.8.0.jar
- 同学-1.3.0.jar
- dom4j-1.6.1.jar
- 休眠-共享资源-注释-5.0.3.最终.jar
- 休眠核心-5.3.0.最终.jar
- hibernate-jpa-2.0-api-1.0.0.final.jar
- jandex-2.0.3.最终版.jar
- javassist-3.22.0-GA .jar
- javax.persistence-api-2.2.jar
- jboss-logging-3.3.2.Final.jar
- jboss-transaction-api_1.2_spec-1.0.1.Final.jar
- Mysql-connector-java-8.0.11.jar
我在标题中提到的错误提到了我的代码中的一行,这是第一个代码狙击中的一行,其中发生了.buildSessionFactory((。
类路径中有冲突的 jar:
-
hibernate-jpa-2.0-api-1.0.0.Final.jar
-
javax.persistence-api-2.2.jar
javax.persistence.Table.indexes 是 JPA 2.1 中添加的一项功能。
因此,您应该丢弃 hibernate-jpa-2.0-api-1.0.0.Final.jar jar,因为它只描述了 JPA 2.0 API。
当应用程序可以使用同一类的多个版本时,很难预测将首先加载哪个版本,这就是为什么它有时看起来有效。但这基本上是彩票,所以你永远不应该在实践中这样做。
我有这个错误,因为我们使用了树脂服务器并升级了休眠
树脂具有JPA 2.0
并且 Web 应用程序具有休眠-jpa-2.1-api-1.0.2.Final.jar
这就是Steve C
回答中所述的冲突罐的原因
要解决此问题,您需要按照 https://www.caucho.com/resin-4.0/admin/database.xtp#Hibernate 中所述进行操作
在树脂配置文件中,将新的 API 库添加到树脂类路径中,如下所示
<server-default>
<jvm-classpath>path/to/lib/hibernate-jpa-2.1-api-1.0.2.Final.jar</jvm-classpath>
...
<server-default>