Spring MVC: хранение данных с отношениями ManyToOne/OneToMany

Я использую Spring-mvc и Spring-data-jpa в своем проекте. У меня есть эти две сущности

Location.java:

@Entity
@Table(name = "location")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Location {
    @Id
    @GeneratedValue
    private int id;

    // other attributes...

    @ManyToOne(optional=true)
    @JoinColumn(name ="user")
    @JsonBackReference
    private User user;

    @ManyToOne(optional=true)
    @JoinColumn(name ="client")  
    @JsonBackReference
    private Client client;

    public int getId() {
        return id;
    }

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

    // getters & setters

}

Пользователь.java:

@Entity
@Table(name = "users")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {

    @Id
    @GeneratedValue
    private int uid;

    // other attributes...

    @OneToMany(mappedBy="user")
    @JsonManagedReference
    private List<Location> locations;

    // getters & setters...

    @JsonIgnore
    public List<Location> getLocations() {
        return locations;
    }

    public void setLocations(List<Location> locations) {
        this.locations = locations;
    }

}

Что я хочу сделать, так это добавить новое местоположение и связать его с существующим пользователем. Для обоих объектов есть репозиторий и сервис. LocationRepository.java:

public interface LocationRepository extends CrudRepository<Location, Integer> {

    List<Location> findAll();

    //....

}

LocationService.java

@Service
public class LocationService {

    @Autowired
    private LocationRepository locationRepository;


    public List<Location> findAll() {
        return locationRepository.findAll();
    }

    public void save(Location location) {
        locationRepository.save(location);
    }

    @Secured("ROLE_ADMIN")
    public void delete(int locationId) {
        locationRepository.delete(locationId);
    }
}

Апиконтроллер.java

@Controller
@RequestMapping(value = "/rest/api")
public class ApiController {

    @Autowired
    UserService userService;
    @Autowired
    LocationService locationService;

    // Storing a new location

    @RequestMapping(value = "/locations/checkin", method = RequestMethod.POST, produces = "application/json")
    public ResponseEntity<?> checkin(@ModelAttribute("location") Location location) {
        locationService.save(location);
        List<Location> locationslist = locationService.findAll();
        return new ResponseEntity<List<Location>>(locationslist, HttpStatus.OK);
    }

}

Все вроде нормально до сих пор. Я использую этот сервис Restfull для клиента Android, все, что мне нужно сделать, это создать новый объект Location и отправить его через запрос POST на правильный URI.

Это структура объекта:

{
    "id":1,
    ....,
    ....,
    "user":{
            "uid":1,
            "attr1":"value1",
            "attr2":"value2",
             .....
            }
}

Проблема: я всегда получаю сообщение об ошибке (org.hibernate.exception.SQLGrammarException) (вызвано: org.postgresql.util.PSQLException: ERROR: синтаксическая ошибка в или рядом с «пользователем»)

Что я делаю неправильно? и как лучше всего хранить мое местоположение?


person Nidhal Rouissi    schedule 16.05.2014    source источник
comment
можете ли вы опубликовать репозиторий и конфигурацию гибернации, а также   -  person ikumen    schedule 16.05.2014
comment
конфигурация репозитория???   -  person Nidhal Rouissi    schedule 17.05.2014


Ответы (1)


В исключении указано, что генерируется недопустимый оператор SQL.

org.postgresql.util.PSQLException: ERROR: syntax error at or near "user" 

Попробуйте переименовать столбец «пользователь» во что-то, что «пользователь» является зарезервированным словом в Postgres, поэтому вместо

@JoinColumn(name ="user")

использовать что-то вроде

@JoinColumn(name ="user_location")
person Wilfried    schedule 20.05.2014