我在用户和带有两个外键的trip实体之间有一个多对多关系。我正在尝试向用户添加一个trip,即使在我的users表中有这样一个id,我也会收到以下异常:
Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "UserTrip" violates foreign key constraint "user_id"
Detail: Key (user_id)=(1) is not present in table "User".
多对多关系的用户端:
@ManyToMany
@JoinTable(name = "\"UserTrip\"", schema = "\"TransportSystem\"", joinColumns = {
@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "trip_id") })
private List<Trip> trips = new ArrayList<>();
多对多关系的绊脚石方面:
@ManyToMany(mappedBy = "trips")
private List<User> users = new ArrayList<>();
添加行程的dao函数:
public void addTrip(int id, Trip trip) {
executeInsideTransaction(entityManager -> {
User user = entityManager.find(User.class, id);
user.getTrips().add(trip);
});
}
处理同一dao内事务的小助手函数:
private void executeInsideTransaction(Consumer<EntityManager> action) {
EntityTransaction tx = entityManager.getTransaction();
try {
tx.begin();
action.accept(entityManager);
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
}
}
这是我打电话来添加行程的地方(不要认为需要更多的上下文,如果你愿意,我可以提供更多。)
UserService userService = new UserService();
User user = userService.getById(1);
userService.addTrip(1, newTrip);
注意事项:
实体是“user”,但它Map到的表称为“users”,因为在postgresql中,user是保留关键字。
我尝试在用户端合并并删除级联和延迟获取类型
我试图将整个user对象传递给addtrip函数,然后使用entitymanager.merge(),但正如在stackoverflow上看到的那样,我决定使用entitymanager.find()直接从数据库中按id加载用户,然后添加角色并提交事务。不幸的是,这两种情况产生相同的结果(这个例外)。
不用说,数据库中有一个用户\u id=1。
我很感激你的意见。我知道有许多线程关于这个特殊的例外,但老实说,我似乎无法解决它。
1条答案
按热度按时间wbgh16ku1#
这个问题已经解决了,任何人都想知道:这个问题来自于用户在postgresql中是一个保留关键字这一事实。为了避免出现问题,我尝试了多次,创建了一个users表,并将用户实体Map到users表。到目前为止还没有问题。
但是一旦涉及到一个联接表,事情就变得复杂了。在我的例子中,我有一个具有多对多关系的usertrip连接表,hibernate正在从user中寻找一个用户id。我发现没有办法明确地告诉hibernate使用用户而不是用户,这就是为什么我决定将我的表命名为userstrip,所有问题都得到了解决。
经验教训-尽可能避免使用与关键词相似的词。