Hibernate应该很难设置吗?我不断遇到无法解决的错误



我正试图在我的项目中设置Hibernate,以便在我的数据库中启用基于ORM的存储。

现在我只是想在Hibernate中加载一个配置来打开一个会话。我认为这将是一个简单的测试,看看是否一切正常,然后我可以开始执行更艰巨的任务,即实际映射我的类。

但我没有意识到,仅仅加载Hibernate就已经是一个我要坚持一天多的过程了。

昨天,我无法解决加载.cfg.xml文件的问题。我会不断地遇到这个错误:

[15:40:41 ERROR]: [org.bukkit.craftbukkit.v1_19_R1.CraftServer] Unable to perform unmarshalling at line number 0 and column 0 in RESOURCE test.cfg.xml. Message: null initializing LiberCore v0.3 (Is it up to date?)
org.hibernate.internal.util.config.ConfigurationException: Unable to perform unmarshalling at line number 0 and column 0 in RESOURCE test.cfg.xml. Message: null
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:134) ~[?:?]
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:66) ~[?:?]
at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:57) ~[?:?]
at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:254) ~[?:?]
at org.hibernate.cfg.Configuration.configure(Configuration.java:260) ~[?:?]
at net.libercraft.data.database.HibernateManager.<init>(HibernateManager.java:29) ~[?:?]
at net.libercraft.data.DataManager.initializeDatabase(DataManager.java:17) ~[?:?]
at net.libercraft.main.Main.onLoad(Main.java:34) ~[?:?]
at org.bukkit.craftbukkit.v1_19_R1.CraftServer.loadPlugins(CraftServer.java:460) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:314) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.MinecraftServer.v(MinecraftServer.java:1142) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:310) ~[purpur-1.19.2.jar:git-Purpur-1765]
at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) ~[?:?]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[?:?]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[?:?]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[?:?]
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:123) ~[?:?]
... 12 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:587) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122) ~[?:?]
at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155) ~[?:?]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276) ~[?:?]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[?:?]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[?:?]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[?:?]
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:123) ~[?:?]
... 12 more

首先在谷歌上搜索并阅读其他帖子,只是让我找到了一堆需要添加的库,因为JAXB在默认情况下不再包含在java中。所以我尝试添加以下内容(不同的帖子指向不同的库,这让我很困惑。(:

<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>6.0.4.Final</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>

这并没有太大的改变,因为我只是不断地得到同样的错误。

经过一点谷歌搜索,我发现了一些关于jaxb.properties文件的解释,我可以使用该文件将指向com.sun.xml.internal.bind.v2.ContextFactory的包更改为应该包含的包。这工作了一段时间,在这一点上,我只是得到了错误,它找不到我的cfg.xml文件。当我尝试将它们放在.jar的不同位置时,我又回到了上面的错误。

我还阅读了关于使用hibernate.properties文件而不是使用xml的内容。然而,我想在我的jar中包含不同的配置文件,并根据我的应用程序运行的环境选择一个。因此,我不想只尝试一个简单的hibernate.properties文件,因为这真的不允许我自定义它。

今天我决定走另一条路。我不想通过xml文件提供配置,而是通过编程方式输入配置。这解决了以前无法处理xml文件的错误。

但现在我遇到了无法解决的新错误。

[09:22:53 ERROR]: [org.bukkit.craftbukkit.v1_19_R1.CraftServer] com/fasterxml/classmate/TypeResolver initializing LiberCore v0.3 (Is it up to date?)
java.lang.NoClassDefFoundError: com/fasterxml/classmate/TypeResolver
at org.hibernate.boot.internal.ClassmateContext.<init>(ClassmateContext.java:16) ~[?:?]
at org.hibernate.boot.internal.BootstrapContextImpl.<init>(BootstrapContextImpl.java:81) ~[?:?]
at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:124) ~[?:?]
at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:158) ~[?:?]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:673) ~[?:?]
at net.libercraft.data.database.HibernateManager.<init>(HibernateManager.java:50) ~[?:?]
at net.libercraft.data.DataManager.initializeDatabase(DataManager.java:17) ~[?:?]
at net.libercraft.main.Main.onLoad(Main.java:34) ~[?:?]
at org.bukkit.craftbukkit.v1_19_R1.CraftServer.loadPlugins(CraftServer.java:460) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:314) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.MinecraftServer.v(MinecraftServer.java:1142) ~[purpur-1.19.2.jar:git-Purpur-1765]
at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:310) ~[purpur-1.19.2.jar:git-Purpur-1765]
at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver
at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:153) ~[purpur-api-1.19.2-R0.1-SNAPSHOT.jar:?]
at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:105) ~[purpur-api-1.19.2-R0.1-SNAPSHOT.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
... 13 more

在谷歌搜索后,我发现了一些帖子,提供了一些解决方案:

如何在运行春季启动应用时解析java.lang.NoClassDefFoundError:com/fasterxml/同学/TypeResolver

导致原因:java.lang.ClassNotFoundException:com.fasterxml.jackson.databind.JavaType未找到

但这些对我没有多大帮助。

我尝试添加hibernate验证器库(多个版本(,但它没有解决错误。我不知道如何将com.fasterxml.jackson与org.codehaus.ackson包交换,甚至不知道我的项目中是否使用了org.codeaus.jackson。

我觉得自己做错了什么。因为在这些我无法解决的错误之间,我得到了更多的ClassNotFoundException等,这需要我导入更多的maven库来修复它们。这不是Maven应该自己处理的事情吗?比如,它不应该为我添加到pom.xml中的库自动加载任何依赖库吗?为什么它需要我手动添加所有这些,然后我的软件才能工作。

youtube上的教程视频都没有谈到这个过程,它们只是告诉你为hibernate本身添加单个maven依赖性。不需要额外的库。所以,我觉得奇怪的是,我被这些错误带向了那个方向。

对我来说,在我的项目中实现ORM解决方案是非常重要的,我对它的发展感到失望。我听说Hibernate是最好的解决方案,但也许有不同的解决方案供我尝试?

对于某些上下文:我正在为游戏minecraft开发一个插件,该数据库将用于存储玩家和其他游戏功能的数据。

请记住,如果您使用的是最近的平台"javax",则库可能已移动到包"jakarta"。试着在IDE/类路径中搜索实际的实现是什么!我在这方面很成功。

<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
</dependency>

相关内容

最新更新