2016-09-01 3 views
2

Ich habe ein Problem mit der JPA-Beziehung innerhalb einer MVC SpringBoot-Anwendung.MVC SpringBoot und JPA-Beziehung

Ich versuche, eine Anwendung zu erstellen, wo ich eine Anzahl von Benutzern habe und jeder Benutzer eine Anzahl von Autos haben kann. Ein Benutzer kann mehrere Autos haben. Ich habe eine @OneToOne Beziehung zwischen dem Benutzer und dem Auto-Objekt gemacht, hier ist was ich getan habe:

hier ist die Benutzerklasse:

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

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "username", nullable = false) 
    private String username; 

    @Column(name = "password", length = 500, nullable = false) 
    private String password; 

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
    private List<Car> cars; 

} 

dann hier ist die Car-Klasse:

@Entity 
@Table(name = "car") 
public class Car implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(length = 11) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "make", nullable = false) 
    private String make; 

    @Column(name = "model", nullable = false) 
    private String model; 

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "id") 
    private User user; 

} 

dann hier ist die eigentliche Service-Implementierung

@Component 
@Transactional(readOnly = true) 
public class CarServiceImpl implements CarService { 

@Inject 
private CarRepository carRepository; 

@Inject 
private UserRepository userRepository; 

@Override 
@Transactional(readOnly = false) 
public Car addCar(Long userId, Car car) { 
    User user = userRepository.findOne(userId);  
    user.getGpsLocationModels().add(car); 

    car.setUser(user); 
    carRepository.save(car); 

    return car; 
} 

dann habe ich den Endpunkt aber, dass funktioniert voll. Die Add-Methode sieht so aus, als ob sie funktioniert, zumindest bekomme ich die erwartete Ausgabe, aber die Find-Methode habe ich keine Ahnung, wie ich sie schreiben soll, kann nicht herausfinden, wie man Autos basierend auf Benutzer abrufen kann, ich weiß wie um sie nach ihrer ID zu bekommen, aber nicht für jeden Benutzer einzeln.

Hier ist mein Versuch:

@Override 
public Car findCar(Long userId, Long carId) { 

    //get the current user (that comes as JSON Request Param) 
    User user = userRepository.findOne(userId); 

    //get the car based on its ID, here's the problem, I want the car based on its ID AND its user, I can't display cars which aren't for that particular user 
    Car car = carRepository.findOne(carId); 

    return car; 
} 

Hier ist die Methode für bekommen alle Fahrzeuge für einen bestimmten Benutzer:

@Override 
public List<Car> displayAllCars(Long userId) { 
    return userRepository.findOne(userId).getCars(); 
} 

ich wirklich jede Hilfe dankbar würde, die Sie beraten können.

Vielen Dank

Antwort

2

Ihre Zuordnungen sind falsch. Auto> Benutzer ist @ManyToOne. Wenn Sie auch diese bidirektionale machen können Sie auch abrufen dann die Autos über den Anwender:

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

    @OneToMany(mappedBy ="user",cascade = CascadeType.ALL) 
    private Set<Car> cars; 

    public Set<Car> getCars(){ 
     return cars; 
    } 

    public void addCar(Car car){ 
     cars.add(car); 
     car.setUser(this); 
    } 
} 

@Entity 
@Table(name = "car") 
public class Car implements Serializable { 

    @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name="user_id") 
    private User user; 
} 

@Override 
public Set<Car> findCars(Long userId) { 
    return userRepository.findOne(userId).getCars(); 
} 
+0

Hallo Alan, Vielen Dank für Ihre Hilfe. Bitte überprüfen Sie den obigen Code, wie ich es bearbeitet habe. Ich bekomme im Moment eine Ausnahme. Auch die findCars-Methode ist für alle Autos, aber ich brauche nur ein bestimmtes Auto für diesen bestimmten Benutzer, basierend auf Auto ID oder Marke oder Modell (egal). Außerdem habe ich die Beziehung @ManytoOne nicht gemacht, da ich gedacht habe, dass jeder HTTP-Anruf, den ich mache, ein Auto sein wird, nicht mehrere Autos bei demselben Anruf, jedoch wurde der Code wie vorgeschlagen geändert. Ich danke dir sehr. Wirklich sehr geschätzt :) – Raducu

+0

Sotry aber deine Frage wurde beantwortet und ist jetzt zu weit gefasst. –

+0

In Ordnung, keine Sorgen. Kannst du mir wenigstens sagen, ob die Abbildungen diesmal aus dem obigen Code gut aussehen? Ich danke dir sehr :) – Raducu

0

Sie könnten eine Methode, die den Benutzer-ID akzeptiert und gibt die Liste im Auto Repository wie:

List<Car> findCarByUser(Long userID); 

Und dann werden Sie

@Override 
public List<Car> displayAllCars(Long userId) { 
return carRepository.findCarByUser(userId); 
}