Domanda Hibernate DAO imposta il valore dell'oggetto come oggetto


Sto cercando di usare Hibernate sul mio progetto  << tutte le fonti, se lo si desidera, cerco di creare e salvare un lettore di oggetti all'avvio, ricevo il seguente errore:

START SCRIPT!
org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.util.Date centaurus.domain.User.created] by reflection for persistent property [centaurus.domain.User#created] : User{id=0, email='test', created=Wed Jun 08 13:06:53 BST 2016}
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:43)
    at org.hibernate.property.access.spi.GetterFieldImpl.getForInsert(GetterFieldImpl.java:58)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValuesToInsert(AbstractEntityTuplizer.java:521)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.getPropertyValuesToInsert(PojoEntityTuplizer.java:228)
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValuesToInsert(AbstractEntityPersister.java:4701)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:254)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669)
    at centaurus.service.player.PlayerDAOimpl.saveUser(PlayerDAOimpl.java:32)
    at centaurus.Dbmaintain.start(Dbmaintain.java:25)
    at restx.factory.Factory.start(Factory.java:846)
    at restx.RestxMainRouterFactory.build(RestxMainRouterFactory.java:450)
    at restx.RestxMainRouterFactory.newInstance(RestxMainRouterFactory.java:70)
    at restx.servlet.RestxMainRouterServlet.init(RestxMainRouterServlet.java:74)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:519)
    at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:331)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:747)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:706)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
    at org.eclipse.jetty.server.Server.doStart(Server.java:277)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
    at restx.server.JettyWebServer.start(JettyWebServer.java:109)
    at restx.server.JettyWebServer.startAndAwait(JettyWebServer.java:114)
    at centaurus.AppServer.main(AppServer.java:30)
Caused by: java.lang.IllegalArgumentException: Can not set java.util.Date field centaurus.domain.User.created to centaurus.domain.User
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:379)
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39)
    ... 40 more
2016-06-08 13:06:53,232 [main            ] [          ] INFO  restx.monitor.MetricsConfiguration - registering Metrics JVM metrics

Ho fatto un passo attraverso il mio programma e sembra che un oggetto valido abbia passato la funzione di salvataggio in ibernazione e da qualche parte al suo interno genera un errore. Ho provato a rimuovere il campo creato, a quel punto si lamenta di un campo di stringa con lo stesso errore, cercando di impostarlo come un oggetto Player stesso.

ecco la mia DAOimpl.class

package centaurus.dao.user;

import centaurus.domain.User;

import centaurus.service.HibernateUtils;
import restx.factory.Component;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import javax.inject.Named;
import java.util.List;

@Component
public class UserDAOimpl implements UserDAO {
    private static HibernateUtils hibernateUtils;

    public UserDAOimpl(@Named("HibernateUtils") HibernateUtils hibernateUtils) {
        this.hibernateUtils = hibernateUtils;
    }

    public User saveUser(User user){
        Session session = hibernateUtils.getFactory().openSession();
        Transaction tx = null;
        Integer playerID = null;
        try{
            tx = session.beginTransaction();
            //playerID = (Integer) session.save(user);
            session.save(user);

            tx.commit();

        }catch (HibernateException e) {
            if (tx!=null) tx.rollback();
            e.printStackTrace();
        }finally {
            session.close();
        }
        return user;
    }

    public User getUser(int playerId){
        Session session = hibernateUtils.getFactory().openSession();
        try{
            User user = (User)session.get(User.class, playerId);
            return user;
        }catch (HibernateException e) {

        }finally {
            session.close();
        }
        return null;
    }

    public List<User> getUsers(){
        Session session = hibernateUtils.getFactory().openSession();
        List<User> list = null;
        try{
            list = session.createCriteria(User.class).list();

        }catch (HibernateException e) {

        }finally {
            session.close();
        }
        return list;
    }
}

Ho cercato su google e su Google e ho provato quante più lezioni di ibernazione riesco a trovare e ho ancora questo problema. Non capisco perché hibernate stia cercando di impostare un campo come oggetto, ho le mie annotazioni.

nel caso in cui si desideri qui è il mio lettore di oggetti di dominio:

package centaurus.domain;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;

@Entity
@Table(name="users")
public class User implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private int id = 0;

    @Column(name="EMAIL")
    private String email = "";

    @Column(name="CREATED")
    private Date created = null;

    public User(){
        Calendar cal = Calendar.getInstance();
        this.created = cal.getTime();
    };

    public User(int id, String email, Date created) {
        this.id = id;
        this.email = email;
        this.created = created;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

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

    public int getId() {
        return id;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", email='" + email + '\'' +
                ", created=" + created +
                '}';
    }
} 

ed ecco la classe chiamante:

package centaurus;

import centaurus.dao.user.UserDAO;
import centaurus.domain.User;
import restx.factory.AutoStartable;
import restx.factory.Component;

import javax.inject.Named;


@Component
public class DBMaintain implements AutoStartable{
    private UserDAO userDAO;

    public DBMaintain(@Named("UserDAOimpl") UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public void start(){
        System.out.println("START SCRIPT!");

        //test
        User p = new User();
        p.setEmail("test");
        userDAO.saveUser(p);

    }
}

Per favore qualcuno sa come risolvere questo problema, grazie.

EDIT: (aggiunto sql)

CREATE TABLE Users(
    USER_ID int NOT NULL AUTO_INCREMENT,
    CREATED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    EMAIL varchar(45) DEFAULT NULL,
    PRIMARY KEY (USER_ID)
);

EDIT ha aggiunto la configurazione di ibernazione /src/main/resources/hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection properties - Driver, URL, user, password -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/andromeda</property>
        <property name="hibernate.connection.username">api</property>
        <property name="hibernate.connection.password">apipassword</property>
        <!-- Connection Pool Size -->
        <property name="hibernate.connection.pool_size">1</property>

        <!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- Outputs the SQL queries, should be disabled in Production -->
        <property name="hibernate.show_sql">true</property>

        <!-- Dialect is required to let Hibernate know the Database Type, MySQL, Oracle etc
            Hibernate 4 automatically figure out Dialect from Database Connection Metadata -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>


        <mapping class="centaurus.domain.User"/>
    </session-factory>
</hibernate-configuration>

11
2018-06-06 11:46


origine


risposte:


rimuovere la classe User dal centaurus del pacchetto

perché?

Su AppServer.main hai:

System.setProperty ("restx.app.package", "centaurus");

questo farà sì che il restx ricompili tutto ciò che è all'interno del pacchetto centaurus e usi questa classe ricompilata, ma apparentemente ibernato sta recuperando i campi dalla classe originale, non da quella ricompilata

Ecco lo stacktrace che conta davvero:

Caused by: java.lang.IllegalArgumentException: Can not set java.util.Date field centaurus.domain.User.created to centaurus.domain.User
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:379)

La JVM lancia un'eccezione perché non può utilizzare il campo (che è stato recuperato da hibernate dalla compilation originale) nella classe User (che è stata caricata da restx dalla compilation restx)


1
2018-06-14 03:46



Non sono sicuro se questa è la risposta ma vedremo!

Prova a sostituire

CREATED TIMESTAMP DEFAULT CURRENT_TIMESTAMP

con

CREATED DATETIME DEFAULT CURRENT_DATETIME,

Vedere la differenza tra Timestamp e Datetime in SQL è I valori TIMESTAMP vengono convertiti dal fuso orario corrente in UTC per la memorizzazione e convertiti da UTC al fuso orario corrente per il recupero. (Ciò si verifica solo per il tipo di dati TIMESTAMP, non per altri tipi come DATETIME.) Se si memorizza un valore TIMESTAMP e quindi si modifica il fuso orario e si recupera il valore, il valore recuperato è diverso dal valore memorizzato. TimeStamp MySQL

Mentre DATETIME rappresenta una data (come trovata in un calendario) e un'ora (come si può osservare su un orologio da parete),

Poiché non è possibile memorizzare Java Date in un oggetto TIMESTAMP SQL, modificare SQL TIMESTAMP in DATETIME o modificare

private Date created;

a

private Timestamp created;

//And convert your Date to TimeStamp
public User(){
    Date date = new Date();
    created = new Timestamp(date .getTime());
}

Spero che questo ti aiuti!


2
2018-06-10 10:37



L'ibernazione non può essere trasformata in joda DateTime. Prova ad annotare la tua colonna con

@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")

Vedere Qui per riferimento.


0
2018-06-06 12:01



Sembra che si tratti di un bug in questa versione di Hibernate

HHH-10618

Prova a usarne un altro.


0
2018-06-10 14:01



Il campo della data deve essere annotato come segue:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "creation", updatable = false, length = 19)
public Date getCreation() {
    return this.creation;
}

public void setCreation(Date creation) {
    this.creation = creation;
}

Assicurati di rinominare la colonna e il nome del file in modo che corrisponda al tuo progetto.


0
2018-06-15 07:57