0

I'm currently trying to setup hibernate for a Database, and I ran into this problem, which I've been trying to fix for like 4 hours.

The error:

Apr 27, 2021 8:22:26 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.4.0.Final}
Apr 27, 2021 8:22:26 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Apr 27, 2021 8:22:26 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] at URL [jdbc:sqlserver://localhost:1434;DatabaseName=Chatbot]
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=sa}
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Apr 27, 2021 8:22:26 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on backend.classes.Result.answer references an unknown entity: java.lang.String
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1815)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1759)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1646)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:903)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:934)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at backend.classes.DBConnector.setUp(DBConnector.java:28)
    at backend.classes.DBConnector.run(DBConnector.java:18)
    at backend.classes.DBConnector.main(DBConnector.java:13)

My Dataclass:

package backend.classes;

import javax.persistence.CascadeType;
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;

@Entity
@Table(name = "dbo.AntwortUndTag")
public class Result {
    int id;
    String answer;
    String tag;
    int tagUpvotes;
    int tagDownvotes;
    int tagUsages;

    @Id
    @Column(name = "antwortUndTagID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "antwort")
    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    @OneToOne(cascade = CascadeType.ALL)
    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    
    public int getTagUpvotes() {
        return tagUpvotes;
    }

    public void setTagUpvotes(int tagUpvotes) {
        this.tagUpvotes = tagUpvotes;
    }

    public int getTagDownvotes() {
        return tagDownvotes;
    }

    public void setTagDownvotes(int tagDownvotes) {
        this.tagDownvotes = tagDownvotes;
    }

    @Column(name = "anzahlTagVerwendung")
    public int getTagUsages() {
        return tagUsages;
    }

    public void setTagUsages(int tagUsages) {
        this.tagUsages = tagUsages;
    }

    public Result(int id, String answer, String tag, int tagUpvotes, int tagDownvotes, int tagUsages) {
        super();
        this.id = id;
        this.answer = answer;
        this.tag = tag;
        this.tagUpvotes = tagUpvotes;
        this.tagDownvotes = tagDownvotes;
        this.tagUsages = tagUsages;
    }

    public Result() {

    }

    @Override
    public String toString() {
        return "Result [id=" + id + ", answer=" + answer + ", tag=" + tag + ", tagUpvotes=" + tagUpvotes
                + ", tagDownvotes=" + tagDownvotes + ", tagUsages=" + tagUsages + "]";
    }
}

My persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <persistence-unit name="chatbot">
        <description>
            Persistence Unit for the Chatbot
        </description>


        <class>java.lang.String</class>
        <class>backend.classes.Result</class>
        
        <exclude-unlisted-classes>false</exclude-unlisted-classes>

        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1434;DatabaseName=Chatbot" />
            <property name="javax.persistence.jdbc.user" value="****" />
            <property name="javax.persistence.jdbc.password" value="****" />
            <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>

    </persistence-unit>

</persistence>

My Demo Class to test my connection:

package backend.classes;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DBConnector {
    private EntityManagerFactory entityManagerFactory;
    
    public static void main(String[] args) {
        new DBConnector().run();
    }

    void run() {
        try {
            setUp();
            testBasicUsage();
            tearDown();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void setUp() throws Exception {
        entityManagerFactory = Persistence.createEntityManagerFactory("chatbot");
    }

    public void tearDown() throws Exception {
        entityManagerFactory.close();
    }

    public void testBasicUsage() {
        EntityManager em = entityManagerFactory.createEntityManager();
        em.getTransaction().begin();
        
        List<Result> result = em.createQuery( "from dbo.AntwortUndTag", Result.class ).getResultList();
        for ( Result r : result ) {
            System.out.println(r.toString());
        }
        
        em.getTransaction().commit();
        em.close();
    }
}

My database looks like this: Database ORM

From both foreign keys im trying to get the 'antwort' String

I have already tried adding the classes 'Result' and 'String' in the persistence.xml

2
  • 2
    for a start why do you have <class>java.lang.String</class> ? Secondly, do you have tables called tag and answer, and if so why are they not in your persistence.xml ? Commented Apr 27, 2021 at 7:38
  • @JoinColumn(name = "antwort") looks wrong as well. Check your UML diagram Commented Apr 27, 2021 at 7:45

1 Answer 1

2

Associations need to be associated to other entities (or embeddables). The error is telling you what's wrong: you are trying to associate a one to one to a String in Result.answer.

What you need to do is to map all three tables as entities:

@Entity
@Table(name = "Antworten")
class Antwort {
...
}

@Entity
@Table(name = "AntwortUndTag")
class Result {
    ...
}


@Entity
@Table(name = "Tags")
class Tag {
...
}

Now you can create the association in Result:

@Entity
@Table(name = "AntwortUndTag")
class Result {

   @ManyToOne
   @JoinColumn(name="antwortID")
   Antwort answer;

   @ManyToOne
   @JoinColumn(name="tagID")
   Tag tag;
}

Note that I've used a @ManyToOne because from the diagram it seems that an answer can have multiple tags.

You can find a lot of examples on how to map associations in the Hibernate ORM documentation. In particular see Example 172. Bidirectional many-to-many with link entity. It seems that's the mapping that you need.

Sign up to request clarification or add additional context in comments.

1 Comment

It worked just like you told me, now I just have some connection / login error but I should be able to fix them myself. Thank you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.