我有我认为在 JPA 中的直接关系。看起来像这样。公司组别:
@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>
原文由 why_vincent 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的实体映射到作为 SQL 保留关键字 (
User
) 的表名。遗憾的是,您选择的 JPA 提供程序不会自动引用表名标识符,因此在引用该表时会出现异常。解决方案是在
@Table
注释中自己引用表名,或者将表名更改为不是保留关键字。或者使用为您自动引用此类保留关键字的 JPA 提供程序(例如DataNucleus
)