2016-11-03 3 views
3

У меня есть то, что я считал прямым отношением в JPA. Похоже на это. CompanyGroup:PSQLException: ОШИБКА: синтаксическая ошибка около или около

@Entity 
@Table 
public class CompanyGroup implements Serializable { 


    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue 
    private Long id; 
    @Column(name = "name") 
    private String name; 
    @JoinColumn(name = "companies") 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<Company> companies; 
} 

Компания:

@Entity 
@Table 
public class Company implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "name") 
    private String name; 
    @JoinColumn(name = "users") 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<User> users; 

    @Id 
    @GeneratedValue 
    private Long id; 
} 

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

@Entity 
@Table 
public class User { 

    @Column(name = "firstName") 
    private String firstName; 
    @Column(name = "lastName") 
    private String lastName; 
    @Column(name = "email") 
    private String email; 


    @Id 
    @GeneratedValue 
    private Long id; 
} 

Я опущенные сеттеров, добытчиками и т.д.

Это не работает. Я пытаюсь спасти CompanyGroup (имеет 2 компании, каждая компания имеет 2 пользователя, все сущности уникальны) в полностью пустую базу данных.

я настойчив это с помощью Spring-Data, доступ в службе, как это:

@Service 
public class ConcreteCompanyGroupService implements CompanyGroupService { 

    @Autowired 
    private CompanyGroupRepository repository; 
    @Transactional 
    @Override 
    public void save(CompanyGroup group) { 
     repository.save(Collections.singleton(group)); 
    } 
} 

Когда я пытаюсь вызвать этот метод, я получаю это:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "User" 
    Position: 13 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2458) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2158) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:291) 

Надеюсь, я сделал что-то глупое что кто-то может быстро найти. Я не знаю, как это решить.

EDIT:

Водитель в моем pom.xml:

<dependency> 
    <groupId>org.postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.4.1211</version> 
</dependency> 
+0

Кажется, это то, что происходит здесь: http://stackoverflow.com/questions/3608420/hibernate-saving-user -модели к Postgres –

ответ

8

Ваш объект карты через имя таблицы, которая является SQL зарезервированное слово (User). К сожалению для вас, ваш выбранный поставщик JPA не автоматически цитирует идентификатор имени таблицы, и поэтому вы получаете исключения при обращении к таблице.

Решение должно либо указать имя таблицы непосредственно в аннотации @Table, либо изменить имя таблицы, чтобы не было зарезервированное ключевое слово. В качестве альтернативы используйте поставщика JPA, который автоматически цитирует такие зарезервированные ключевые слова для вас (например, DataNucleus)

Смежные вопросы