在JPA中,我有一个我认为是直接的关系。看起来像这样。CompanyGroup:
@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;
}我省略了setter、getter等。
这不管用。我正在尝试保存一个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)希望我做了一些愚蠢的事情,有人可以很快找到。我不知道怎么解决这个问题。
编辑:
我的pom.xml中的驱动程序:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1211</version>
</dependency>发布于 2016-11-03 18:57:32
您的实体映射到一个表名,该表名是一个SQL保留关键字(User)。不幸的是,您选择的JPA提供程序不会自动引用表名标识符,因此在引用表时会出现异常。
解决方案是在@Table注释中自己引用表名,或者将表名改为不是保留关键字。或者,使用自动为您引用这些保留关键字的JPA提供者(例如DataNucleus)。
发布于 2018-05-19 18:20:26
解决方案1:正如Pascal提到的,您必须使用反斜杠转义表名,如下所示:
@Entity
@Table(name="\"User\"")
public class User {
...
}解决方案2:将表的anme重命名为另一个名称(Users)
@Entity
@Table(name="Users")
public class User {
...
}解决方案3:为表名添加一个后缀:
@Entity
@Table(name="APP_User")
public class User {
...
}解决方案4:更改实体名称,例如ApplicationUser
@Entity
public class ApplicationUser {
...
}reason
PostgreSQL作为一些保留的SQL Key Words。例如: ABORT、ALL、ARRAY、CACHE、CUBE、USER、...这些标记采用SQL标准或特定于PostgreSQL。
发布于 2021-03-25 17:37:55
使用@Table注释或将您的类名从User更改为其他名称,因为User是sql中的保留关键字。
https://stackoverflow.com/questions/40399460
复制相似问题