Błąd hibernate

0

Mam od kilku dni problem przy aplikacji SpringBoot + Hibernate

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.findme.myappbackend.models.User; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.findme.myappbackend.models.User

Posiadam w bazie relację @OneToMany oraz @ManyToOne.
Co może być powodem tego błędu?
Czytałem o braku adnotacji @Cascade jednak to nie pomaga.

0

Czytałem o braku adnotacji @Cascade jednak to nie pomaga.

Nie dziwne. Czytanie jest spoko, ale w tym przypadku trzeba było tą adnotację napisać. W odpowiednim miejscu, z odpowiednimi parametrami.

0

Napisałem

@OneToMany(cascade = CascadeType.ALL)

oraz

@ManyToOne(cascade = CascadeType.PERSIST)
0

W takim razie musisz pokazać dokładniej co robisz. Przynajmniej tą metodę gdzie to leci. Coś nie tak z kolejnością operacji masz.

0
package com.findme.myappbackend.repositories;

import com.findme.myappbackend.models.Device;
import com.findme.myappbackend.models.User;
import org.springframework.data.repository.Repository;


import java.util.List;
import java.util.Set;

public interface DeviceRepository extends Repository<Device, String>
{
    List<Device> findByOwner(User owner);
}
package com.findme.myappbackend.services;

import com.findme.myappbackend.models.Device;
import com.findme.myappbackend.models.User;
import com.findme.myappbackend.repositories.DeviceRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeviceService
{
    DeviceRepository deviceRepository;

    @Autowired
    public DeviceService(DeviceRepository deviceRepository)
    {
        this.deviceRepository=deviceRepository;
    }

    public List<Device> findAllForUser(User user)
    {
        return deviceRepository.findByOwner(user);
    }
}
package com.findme.myappbackend.controllers;

import com.findme.myappbackend.models.Device;
import com.findme.myappbackend.models.User;
import com.findme.myappbackend.services.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class DeviceController
{
    @Autowired
    DeviceService deviceService;

    User user = new User("admin", "admin");

    @GetMapping(value = "/devices")
    public List<Device> showDevices()
    {
       return deviceService.findAllForUser(user);
    }
}
0

Leci Ci to na tym findAllForUser?
No nie dziwne (chociaż nie kojarze tego wyjątki z takiego miejsca). Object user nie ma nic wspólnego z hibernatem/ sesją.

Podpowiedź, najpierw wyciągnij tego obiekcika z bazy. Pewnie masz jakieś UserRepository i pewnie jakiś findByLogin.
Rób to w metodzie - nie cachuj tego sobie. (Da się, ale nie uprzykrzaj sobie życia, jest taka chamska wersja przyłaczenia user do sesji - z użyciem lock, ale nie polecam na twoim poziomie).

0

Robić to w metodzie findAllForUser?

0

u Ciebie by było w showDevices.
Ale może lepiej przekaż id/login jako string do findAllForUser.

W zasadzie pytanie na koniec czy ty tam jakieś security i autoryzacje przewidujesz i jak chcesz ją zrobić.

0

Będzie security, w późniejszym etapie. Póki co chce przetestować metody i JSONy

0

Napisałem coś takiego

@PostMapping(value = "/newuser")
    public User addUser(User user)
    {
        return userService.addUserToDatabase(user);
    }

Czy w metodach tworzących POST trzeba pisać adnotację @RequestBody przy argumencie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1