由于id为null,休眠未插入到联接表中



用户和具有两个外键的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);

需要注意的事项:

  • 实体是";用户";但是它被映射到的表被称为"表";用户";因为在PostgreSQL中,User是一个保留关键字
  • 我尝试了MERGE和REMOVE级联以及用户端的惰性获取类型
  • 我试图将整个User对象传递给addTrip函数,然后使用entityManager.merge((,但正如stackoverflow上所读的那样,我决定使用entityManager.find((直接从数据库中按id加载用户,然后添加一个角色并提交事务。不幸的是,这两种情况都会产生相同的结果(这个例外(
  • 不用说,数据库中有一个user_id=1

我非常感谢您的意见。我知道有很多关于这个特殊异常的线程,但老实说,我似乎无法解决它

对于任何想知道的人来说,这个问题已经解决了:这个问题源于User是PostgreSQL中的一个保留关键字。我多次尝试避免它的问题,我创建了一个Users表,并将我的User实体映射到Users表。到目前为止没有任何问题。

但一旦涉及到一个联接表,事情就会变得复杂起来。在我的例子中,我有一个UserTrip联接表,它具有多对多关系,Hibernate正在从user中查找user_id。我找不到明确告诉hibernate使用Users而不是User的方法,这就是为什么我决定将我的表命名为UsersTrip,并且一切都得到了解决。

经验教训-尽可能避免使用与关键字相似的单词。

最新更新