Как правильно настроить постоянство гибернации с помощью Java-модели - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь написать API отдыха для взаимодействия с MariaDB. Мне кажется, что я в основном там, но получаю следующую ошибку:

    java.lang.IllegalArgumentException: Unknown entity: Models.User
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:808)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
at test.Application.addUser(Application.java:40)
at test.Application.main(Application.java:18)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:542)
at java.base/java.lang.Thread.run(Thread.java:834)

Я предполагаю, что это потому, что я неправильно настроил пользовательский класс в файле persistence.xml в resources / META-INF. Ниже приведены соответствующие файлы:

persistence.xml

     <?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
         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">
<persistence-unit name="potholeAPI" transaction- 
   type="RESOURCE_LOCAL">



<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>Models.User</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" 
    value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.url" 
    value="jdbc:mysql://localhost:3306/PotholeDB? 

    useUnicode=true&amp;useJDBCCompliantTimezoneShift
 =true&amp;useLegacyDate
    timeCode=false&amp;serverTimezone=UTC"/>
        <property name="javax.persistence.jdbc.user" value="admin"/>
        <property name="javax.persistence.jdbc.password" value="admin"/>

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

    </properties>
</persistence-unit>

User.java

    package Models;

    import org.hibernate.annotations.Entity;
    import org.hibernate.annotations.Table;

    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;

    @Entity
    @Table(appliesTo = "Users")
    public class User implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@Column(name = "id", unique = true)
private int id;

@Column(name = "name", unique = true)
private String name;

@Column(name = "created_date")
private int created_date;

getters and setters....

, а также основной и драйвер длямое тестирование Application.java

    package test;

    import Models.User;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    import javax.persistence.*;
    import java.util.Date;
    import java.util.List;

    @SpringBootApplication
public class Application {
private static EntityManagerFactory ENTITY_MANAGER_FACTORY =                         
Persistence.createEntityManagerFactory("potholeAPI");

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);

    addUser(1, "jim");
    addUser(2, "bob");

    getUser(1);
    getUsers();


    ENTITY_MANAGER_FACTORY.close();
}

public static void addUser(int id, String name) {
    EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
    EntityTransaction et = null;
    Date date = new Date();
    try {
        et = em.getTransaction();
        et.begin();
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setCreated_date(date.getDate());
        em.persist(user);
    } catch (Exception ex) {
        if (et != null) {
            et.rollback();
        }
        ex.printStackTrace();
    } finally {
        em.close();
    }
}

public static void getUser(int id) {
    EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
    String query = "SELECT u FROM User u WHERE u.id = :userID";

    TypedQuery<User> tq = em.createQuery(query, User.class);
    tq.setParameter("userID", id);
    User user = null;
    try {
        user = tq.getSingleResult();
        System.out.println(user.getName() + " ");
    } catch (NoResultException e) {
        System.out.println("ex");
        e.printStackTrace();
    } finally {
        em.close();
    }
}

public static void getUsers() {
    EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
    String query = "SELECT u FROM User u WHERE u.id IS NOT NULL";

    TypedQuery<User> tq = em.createQuery(query, User.class);
    List<User> users;
    try {
        users = tq.getResultList();
        users.forEach(user-> System.out.println(user.getName()+ " "));
    } catch (NoResultException e) {
        System.out.println("ex");
        e.printStackTrace();
    } finally {
        em.close();
    }

}

}

Я подозреваю, что я испортил файл xml, однако я новичок в раскручивании такого API, поэтому я не совсем уверен.

1 Ответ

0 голосов
/ 30 сентября 2019

Имя таблицы - «Пользователь», поэтому User.java -> @ Table (applyTo = «Users») должно быть @Table (applyTo = «User»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...