• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java JPA unknow entity

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,151 wizyt
pytanie zadane 6 września 2017 w Java przez Wally Bywalec (2,840 p.)
edycja 6 września 2017 przez Wally

EDIT: Zrobiłem drugi identyczny projekt (identyczne wersje dependencies), tylko na Maven zamiast Gradle i wszystko działa. Tylko na Gradle nie.
Przy projekcie Gradle, jak dodam do persistence.xml, linijke z <class>model.User</class> to działa. Przy Mavenie nie muszę tego robić. W zasadzie problem zniknął, ale jednak powinno się dać bez tej dodatkowej linijki.

 

Odpalam program i dostaję taki exception:

Exception in thread "main" java.lang.IllegalArgumentException: Unknown entity: model.User

Nowy projekt na gradle. Dependencies na: 

compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.10.Final'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.13'

Odpalany plik Main.java (żeby krócej to tylko main, plus są importy same na javax.persistence):

public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        User u = new User();
        u.setName("Test");

        entityManager.getTransaction().begin();
        entityManager.persist(u);
        entityManager.getTransaction().commit();

        entityManager.close();
        entityManagerFactory.close();
    }

Plik encji User (+ settery/gettery, importy na javax.persistence tylko; czesty blad to Entity z hibernate; ja mam poprawnie z javax.persistence.Entity):

@Entity
public class User {

    public User() {}

    @Id
    @GeneratedValue
    private long ID;

    private String name;
}

Oraz konfiguracja w src/resources/META-INF/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="myDatabase" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernateTest"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>
</persistence>

 

Przekopałem wiele tematów na stackoverflow itp i nic. Gdy odpalę ten projekt i nie użyję nic z encji User, tylko puszczę natywne query na "SELECT VERSION()" to dostaję - połączenie OK. Jest także odpowiedni provider co powyższym configu - dawniej się używało coś z org.hibernate.ejb. 

Nie mam pojęcia co jest nie tak, że nie potrafi utworzyć tabeli z tej encji, tylko leci exception. Nie zna entity User'a, ale jest przecież podmappowane poprawnie przez @Entity (z javax.persistence.Entity).

komentarz 6 września 2017 przez mbabane Szeryf (79,260 p.)
edycja 6 września 2017 przez mbabane

A te encje nie powinny miec jeszcze adnotacji:

@Table(name = "nazwa_tabeli_w_mysql")
komentarz 6 września 2017 przez Jonki Dyskutant (8,180 p.)
Niestety nie. Bez tej adnotacji powinno utworzyć tabelę automatycznie o nazwie klasy z małej litery.
komentarz 6 września 2017 przez mbabane Szeryf (79,260 p.)

a implementacja interfejsu Serializable?

komentarz 6 września 2017 przez Wally Bywalec (2,840 p.)
edycja 6 września 2017 przez Wally
@mbabane: Dodałem do klasy User "implements Serializable", tylko nie wiem czy to OK, bo nie wymaga to implementacji żadnych metod - pusty interface. Ale idąc dalej, to i tak nie działa.
komentarz 6 września 2017 przez mbabane Szeryf (79,260 p.)

Sprawdz to:

http://o7planning.org/en/11223/generate-tables-from-entity-classes-in-hibernate

i szukaj pod haslem hibernate generate table from entity

komentarz 6 września 2017 przez Wally Bywalec (2,840 p.)

Em, mogłeś nie zauważyć, ale już dawno temu edytowałem posta, że kod działa - tworzy się tabela na podstawie encji Usera. Problem częściowo rozwiązany. Sprawa już nie tyczy się JPA / Hibernate, tylko narzędzi budowania. Maven/Gradle coś inaczej buduje, że tu działa, tam nie.

Już problem nie jest priorytetowy bo działa i można to zostawić. Komuś kiedyś może pomoże jak na gradlu nie będzie wiedział dlaczego nie działa, to trafi tu i się dowie że to coś z build tools i że na mavenie to samo działa.

Gdzieś ktoś pisał na stackoverflow, że to coś z build tools i coś z tymi katalogami, klasami, polecił dodać do gradla taką linijkę

sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir

Ale coś nie działa, nie wnikam dalej.

Natomiast ten link co podajesz, to dokładnie nie wiem, ale sporo kodu tam więcej. Inaczej wygląda konfiguracja. Propertiesy jakieś hibernatowe, a ja wolę się raczej trzymać ogólniejszego javax.persistence. Bo gdyby kiedyś wymienić hibernate na coś innego? No może nie, ale lepiej polegać na abstrakcji, chyba. No a poza tym to co wyżej, to coś z build tools. Maven działa, Gradle nie. A kod ten sam.

1 odpowiedź

0 głosów
odpowiedź 6 września 2017 przez Jonki Dyskutant (8,180 p.)
Nigdy nie bawiłem się w pisanie xml, ale spróbuj zajrzeć tutaj https://stackoverflow.com/questions/1780341/do-i-need-class-elements-in-persistence-xml.

Podobne pytania

0 głosów
0 odpowiedzi 220 wizyt
pytanie zadane 8 marca 2019 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
+1 głos
1 odpowiedź 2,227 wizyt
pytanie zadane 8 czerwca 2016 w Java przez jocom Początkujący (390 p.)
0 głosów
1 odpowiedź 304 wizyt
pytanie zadane 12 maja 2023 w Java przez Mikołaj Pątkowski Użytkownik (530 p.)

93,444 zapytań

142,436 odpowiedzi

322,698 komentarzy

62,806 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...