spring boot + Hibernate + mysql 8 ошибки при вставке

 
 
 
Сообщения:2
Привет, создаю простенький дао по простейшему примеру , получаю в итоге ошибку при попытке сохранить объект в базу , пару лет назад уже делал проект который работал Hibernate и не встречал подобного поведения, все на что указывает мне гугл и стековерфлоу не решает мою проблему , взгляните свежим или более опытным взглядом может я что то упускаю...


Функция на вставку:
	

             public void save(Users user) {
		 Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
	        Transaction tx1 = session.beginTransaction();
	        session.save(user);
	        tx1.commit();
	        session.close();
		
	}



Настройки hibernate

public class HibernateSessionFactoryUtil {
    private static SessionFactory sessionFactory;

    private HibernateSessionFactoryUtil() {}

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            try {
                Configuration configuration = new Configuration();
                
                // Hibernate settings equivalent to hibernate.cfg.xml's properties
                Properties settings = new Properties();
                settings.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
                settings.put(Environment.URL, "jdbc:mysql://127.0.0.1:3306/world?useLegacyDatetimeCode=false&serverTimezone=UTC");
                settings.put(Environment.USER, "user");
                settings.put(Environment.PASS, "password");
                settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL8Dialect");
                settings.put(Environment.SHOW_SQL, "true");
                settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
                settings.put(Environment.HBM2DDL_AUTO, "create-drop");
                configuration.setProperties(settings);
                configuration.addAnnotatedClass(Users.class);
                configuration.addAnnotatedClass(Auto.class);
                //configuration.addAnnotatedClass(UserRole.class);
                
                ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                        .applySettings(configuration.getProperties()).build();
                    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

            } catch (Exception e) {
                System.out.println("Исключение!" + e);
            }
        }
        return sessionFactory;
    }
}



Сущность:

@Entity
@Table (name = "users")
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "name")
    private String name;
    //можно не указывать Column name, если оно совпадает с названием столбца в таблице
    private int age;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Auto> autos;

    public Users() {
    }

    public Users(String name, int age) {
        this.name = name;
        this.age = age;
        autos = new ArrayList<>();
    }

    public void addAuto(Auto auto) {
        auto.setUser(this);
        autos.add(auto);
    }

    public void removeAuto(Auto auto) {
        autos.remove(auto);
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Auto> getAutos() {
        return autos;
    }

    public void setAutos(List<Auto> autos) {
        this.autos = autos;
    }

    @Override
    public String toString() {
        return "models.User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


И собственно сама ошибка:

2019-04-22 13:59:37.605 ERROR 10920 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private int entity.Users.age] by reflection for persistent property [entity.Users#age] : models.User{id=0, name='Masha', age=26}] with root cause

java.lang.IllegalArgumentException: Can not set int field entity.Users.age to entity.Users


Пробовал и с более простыми сущностями в пару не связанных полей , ошибка та же

Буду рад любым идеям
 
 
Сообщения:56
По-мойму, Column пишется всегда. Иначе как хибернэйт поймет, что есть такая же колонка в базе?? А вот name уже можно и не писать, если совпадает.
Изменен:16 мая 2019 12:03
 
 
Сообщения:348
Snuf:
По-мойму, Column пишется всегда. Иначе как хибернэйт поймет, что есть такая же колонка в базе?? А вот name уже можно и не писать, если совпадает.

Согласно документации (правда не последней версии) это не так:
Quote:
Every non static non transient property (field or method depending on the access type) of an entity is considered persistent, unless you annotate it as @Transient. Not having an annotation for your property is equivalent to the appropriate @Basic annotation.
 
 
Сообщения:56
vps:
Согласно документации (правда не последней версии) это не так:
Quote:
Every non static non transient property (field or method depending on the access type) of an entity is considered persistent, unless you annotate it as @Transient. Not having an annotation for your property is equivalent to the appropriate @Basic annotation.


Возможно, вы и правы. Но я думаю, ошибка именно в отсутствии аннотации @Column
 
 
Сообщения:2
Ошибка была в том что я пытался настроить хибернейт второй раз, используя spring boot этого делать не надо и достаточно внести настройки в application.properties. По поводу аннотации @Column она не обязательно, @Entity уже говорит о том что это сущность, поля в бд называются соответственно названию полей класса
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет