Hallo,
ich habe ein java programm, welches alle Daten immer in json Dateien abspeichert. nun wollte ich alles strukturiert neu machen (weil ich beim programmieren viel gelernt habe und einiges nicht schön war) und im selben zug eine sql Datenbank benutzen. Dazu habe ich mich ein wenig auch mit Hibernate beschäftigt. Eine Session (SessionFactory) kann ich aufbauen, aber bei der Abfrage kommt immer:
hier mal all meine Klassen und die Datenbankstruktur. vielleicht seht ihr ja woran es liegt. Hab auch schon stunden mit ChatGPT rumgemacht, aber alles half nicht.
hibernate.cfg.xml
hier nun die DB tabellen. die Datenbank heißt comuniofanapp
Tabelle spieler_db
punktekorrekturen tabelle:
spielerstats tabelle:
ich weiß, ist sau viel, aber ich weiß nicht wo das problem ist.
ich habe ein java programm, welches alle Daten immer in json Dateien abspeichert. nun wollte ich alles strukturiert neu machen (weil ich beim programmieren viel gelernt habe und einiges nicht schön war) und im selben zug eine sql Datenbank benutzen. Dazu habe ich mich ein wenig auch mit Hibernate beschäftigt. Eine Session (SessionFactory) kann ich aufbauen, aber bei der Abfrage kommt immer:
Code:
März 08, 2024 9:54:09 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 6.4.4.Final
März 08, 2024 9:54:09 PM org.hibernate.cache.internal.RegionFactoryInitiator initiateService
INFO: HHH000026: Second-level cache disabled
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using built-in connection pool (not intended for production use)
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: Loaded JDBC driver class: com.mysql.cj.jdbc.Driver
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001012: Connecting with JDBC URL [jdbc:mysql://localhost:3306/comuniofanapp]
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=root}
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
März 08, 2024 9:54:09 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH10001115: Connection pool size: 20 (min=1)
März 08, 2024 9:54:10 PM org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl constructDialect
WARN: HHH90000025: MySQL8Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
März 08, 2024 9:54:10 PM org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl logSelectedDialect
WARN: HHH90000026: MySQL8Dialect has been deprecated; use org.hibernate.dialect.MySQLDialect instead
März 08, 2024 9:54:10 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
java.lang.IllegalArgumentException: org.hibernate.query.sqm.UnknownEntityException: Could not resolve entity class 'klassen.database.Spieler'
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:143)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:167)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:173)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:848)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:136)
at klassen.test.HibernateTest.testDatabaseConnection(HibernateTest.java:37)
at klassen.test.HibernateTest.main(HibernateTest.java:29)
Caused by: org.hibernate.query.sqm.UnknownEntityException: Could not resolve entity class 'Spieler'
at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:90)
at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.createHqlInterpretation(QueryInterpretationCacheStandardImpl.java:165)
at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:147)
at org.hibernate.internal.AbstractSharedSessionContract.interpretHql(AbstractSharedSessionContract.java:790)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:840)
... 3 more
Caused by: org.hibernate.query.sqm.EntityTypeException: Could not resolve entity class 'Spieler'
at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.resolveEntityReference(JpaMetamodelImpl.java:490)
at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.getHqlEntityReference(JpaMetamodelImpl.java:158)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitRootEntity(SemanticQueryBuilder.java:1937)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitRootEntity(SemanticQueryBuilder.java:269)
at org.hibernate.grammars.hql.HqlParser$RootEntityContext.accept(HqlParser.java:2549)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitEntityWithJoins(SemanticQueryBuilder.java:1914)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitFromClause(SemanticQueryBuilder.java:1901)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuery(SemanticQueryBuilder.java:1148)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:941)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:269)
at org.hibernate.grammars.hql.HqlParser$QuerySpecExpressionContext.accept(HqlParser.java:1869)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:926)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:269)
at org.hibernate.grammars.hql.HqlParser$SimpleQueryGroupContext.accept(HqlParser.java:1740)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectStatement(SemanticQueryBuilder.java:443)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitStatement(SemanticQueryBuilder.java:402)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.buildSemanticModel(SemanticQueryBuilder.java:311)
at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:71)
... 7 more
hier mal all meine Klassen und die Datenbankstruktur. vielleicht seht ihr ja woran es liegt. Hab auch schon stunden mit ChatGPT rumgemacht, aber alles half nicht.
Java:
package klassen.spieler;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import klassen.database.Spieler;
@Entity
@Table(name = "punktekorrekturen")
public class Punktekorrektur implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "spielerId")
private Spieler spieler;
@Column(name = "name")
private String name;
@Column(name = "suchname")
private String suchname;
@Column(name = "pointsBefore")
private Integer pointsBefore;
@Column(name = "pointsAfter")
private Integer pointsAfter;
@Column(name = "text")
private String text;
@Column(name = "date")
private Calendar date;
@Column(name = "inPunkteEingerechnet")
private boolean inPunkteEingerechnet;
@Column(name = "mitGeldabzug")
private boolean mitGeldabzug;
public Punktekorrektur() {
super();
}
//getter und setter...
}
Java:
package klassen.spieler;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import klassen.database.Spieler;
@Entity
@Table(name = "spielerstats")
public class Statistik implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "spielerId")
private Spieler spieler;
@Column(name = "totalPenalties")
private int totalPenalties;
@Column(name = "ratedGames")
private int ratedGames;
@Column(name = "playedGames")
private int playedGames;
@Column(name = "totalGoals")
private int totalGoals;
@Column(name = "manOfTheMatchAmount")
private int manOfTheMatchAmount;
@Column(name = "punkteDurchschnitt")
private String punkteDurchschnitt;
@Column(name = "notenDurchschnitt")
private String notenDurchschnitt;
@Column(name = "gelbekarten")
private int gelbekarten;
@Column(name = "rotekarten")
private int rotekarten;
@Column(name = "gelbrotekarten")
private int gelbrotekarten;
@Column(name = "lastUpdate")
private Calendar lastUpdate;
public Statistik() {
super();
}
//getter und setter...
}
Java:
package klassen.database;
import java.io.Serializable;
import java.util.ArrayList;
import enu.IdentifierType;
import enu.Position;
import klassen.extender.Identifier;
import klassen.spieler.Punktekorrektur;
import klassen.spieler.Statistik;
import javax.persistence.*;
@Entity
@Table(name = "spieler_db")
public class Spieler implements Serializable {
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
private static final long serialVersionUID = 1L;
@Column(name = "verein")
private int verein;
@Column(name = "owner")
private int owner;
@Column(name = "position")
@Enumerated(EnumType.STRING) // Falls Position ein Enum ist
private Position position;
@OneToMany(mappedBy = "punktekorrektur", cascade = CascadeType.ALL)
private ArrayList<Punktekorrektur> punktekorrekturen;
@OneToOne(mappedBy = "statistik", cascade = CascadeType.ALL)
private Statistik statistik;
public Spieler() {
super();
}
//getter und setter...
}
hibernate.cfg.xml
XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- DataSource settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/comuniofanapp</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- Hibernate settings -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- Mappings -->
<mapping class="klassen.database.Spieler"/>
<mapping class="klassen.spieler.Statistik"/>
<mapping class="klassen.spieler.Punktekorrektur"/>
</session-factory>
</hibernate-configuration>
hier nun die DB tabellen. die Datenbank heißt comuniofanapp
Tabelle spieler_db
SQL:
-- phpMyAdmin SQL Dump
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Erstellungszeit: 08. Mrz 2024 um 21:09
-- Server-Version: 10.4.32-MariaDB
-- PHP-Version: 8.2.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
-
-- Tabellenstruktur für Tabelle `spieler_db`
--
CREATE TABLE `spieler_db` (
`name` text NOT NULL,
`id` int(11) NOT NULL,
`verein` int(11) NOT NULL DEFAULT 0,
`position` enum('TORHÜTER','ABWEHR','MITTELFELD','STURM','UNBESTIMMT') NOT NULL DEFAULT 'UNBESTIMMT',
`owner` int(11) NOT NULL DEFAULT 0,
`possibleNames` longtext NOT NULL,
`punkte` int(11) NOT NULL,
`wert` int(11) NOT NULL,
`realWert` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Daten für Tabelle `spieler_db`
--
INSERT INTO `spieler_db` (`name`, `id`, `verein`, `position`, `owner`, `possibleNames`, `punkte`, `wert`, `realWert`) VALUES
('thomas', 1234, 1, 'ABWEHR', 2, 'Thomas, Tommy', 50, 160000, 5000000),
('andi', 5555, 3, 'STURM', 1, 'ANDY, Penner', 58, 880000, 1500000);
ALTER TABLE `spieler_db`
ADD PRIMARY KEY (`id`) USING BTREE;
COMMIT;
SQL:
-
-- Tabellenstruktur für Tabelle `punktekorrekturen`
--
CREATE TABLE `punktekorrekturen` (
`id` int(11) NOT NULL,
`spielerId` int(11) NOT NULL,
`pointsBefore` int(11) NOT NULL,
`pointsAfter` int(11) NOT NULL,
`suchname` text NOT NULL,
`text` text NOT NULL,
`date` date NOT NULL,
`inPunkteEingerechnet` tinyint(1) NOT NULL,
`mitGeldabzug` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Daten für Tabelle `punktekorrekturen`
--
INSERT INTO `punktekorrekturen` (`id`, `spielerId`, `pointsBefore`, `pointsAfter`, `suchname`, `text`, `date`, `inPunkteEingerechnet`, `mitGeldabzug`) VALUES
(1, 1234, 13, 25, 'TORRES', 'statt 13 hat er 15 punkte gemacht', '2024-01-25', 1, 0),
(2, 1234, 28, 40, 'TORRES', 'statt 28 hat er 40 punkte gemacht', '2024-01-25', 0, 1);
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `punktekorrekturen`
--
ALTER TABLE `punktekorrekturen`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `punktekorrekturen`
--
ALTER TABLE `punktekorrekturen`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
COMMIT;
spielerstats tabelle:
SQL:
--
-- Tabellenstruktur für Tabelle `spielerstats`
--
CREATE TABLE `spielerstats` (
`id` int(11) NOT NULL,
`spielerId` int(11) NOT NULL,
`totalPenalties` int(11) NOT NULL,
`ratedGames` int(11) NOT NULL,
`playedGames` int(11) NOT NULL,
`totalGoals` int(11) NOT NULL,
`manOfTheMatchAmount` int(11) NOT NULL,
`punkteDurchschnitt` double NOT NULL,
`notenDurchschnitt` double NOT NULL,
`gelbekarten` int(11) NOT NULL,
`rotekarten` int(11) NOT NULL,
`gelbrotekarten` int(11) NOT NULL,
`lastUpdate` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Daten für Tabelle `spielerstats`
--
INSERT INTO `spielerstats` (`id`, `spielerId`, `totalPenalties`, `ratedGames`, `playedGames`, `totalGoals`, `manOfTheMatchAmount`, `punkteDurchschnitt`, `notenDurchschnitt`, `gelbekarten`, `rotekarten`, `gelbrotekarten`, `lastUpdate`) VALUES
(1, 1234, 1, 0, 0, 5, 0, 0, 0, 0, 1, 1, '0000-00-00'),
(2, 5555, 1, 0, 1, 7, 6, 0, 0, 1, 1, 1, '0000-00-00');
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `spielerstats`
--
ALTER TABLE `spielerstats`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `spielerstats`
--
ALTER TABLE `spielerstats`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
COMMIT;
ich weiß, ist sau viel, aber ich weiß nicht wo das problem ist.