当前位置: 首页 > 面试题库 >

Hibernate持久化实体而无需获取关联对象。仅凭身份证

帅令雪
2023-03-14
问题内容

我在2个实体之间有一个简单的关联:

public class Car {

    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    ...

}

public class User {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private long userId;

    ...

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private Set<Car> cars;

    ...

}

然后我从客户端获得一些用户ID。例如,userId == 5;
要与用户保存汽车,我需要下一步:

User user = ... .findOne(userId);  
Car car = new Car();
car.setUser(user);
... .save(car);

我的问题是:是否
可以在不获取用户的情况下保留汽车记录?

同样,就像使用本地SQL查询一样:只需在Car表中插入诸如string(long)之类的userId。

使用第二级lvl缓存会更快,但是我认为我不需要做额外的动作。

我不想使用本机查询的主要原因是因为我的项目中的关联更加困难,并且需要多次保存.car(car)。我也不想手动控制查询执行的顺序。

如果我使用session.createSQLQuery(“ insert .....
values()”),Hibernate的批处理插入是否可以正常工作?

如我错了请纠正我。

提前致谢!

更新:

实际上,映射类似于:

用户和汽车之间存在@ManyToMany关联。但是交叉表也是一个实体,例如,Passanger。因此,映射是下一个:

public class User{
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", targetEntity = Passenger.class)
    private Set<Passenger> passengers;
}

交叉实体

@IdClass(value = PassengerPK.class)
public class Passenger {

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "car_id")
    private Car car;

    ... other fields ...

}

汽车实体:

public class Car {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "car", targetEntity = Passenger.class, cascade = CascadeType.ALL)
    private Set<Passenger> passengers;
}

代码

List<User> users = ... .findInUserIds(userIds); // find user records where userId is IN userIds - collection with user Ids
Car car = new Car();       //initialization of car's fields is omitted
if (users != null) {
    car.setPassengers(new HashSet<>(users.size()));
    users.forEach((user) -> car.getPassengers().add(new Passenger(user, car)));
}
... .save(car);

问题答案:

“我可以在不获取用户的情况下保留汽车记录吗?”

是的,这是Hibernate代理的优点之一:

User user = entityManager.getReference(User.class, userId); // session.load() for native Session API  
Car car = new Car();
car.setUser(user);

这里的关键点是使用EntityManager.getReference:

获取一个实例,其状态可能会延迟获取。

Hibernate只会根据提供的ID创建代理,而无需从数据库中获取实体。

“如果我使用session.createSQLQuery(“插入到..... values()”),Hibernate的批处理插入是否可以正常工作?”

不,不会。查询将立即执行。



 类似资料:
  • 1. 前言 本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。 在本节课程中,你将学到 : Hibernate 的版本发展史; 持久化对象的特点。 为了更好地讲解这个内容,这个初体验案例分上下 2 个章节来讲解。 2. Hibetnate 体系结构 如图可知,应用程序可以通过 Hibernate 为用户提供的接口 API 通知 Hibernate

  • 1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程,你将了解到: 持久化对象的 3 种状态; 什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中的数据将不复存在。 重要的数据,需要使用持久化技术将数据保存到永久性设备上。Hibernate 能够通过 PO(持久化对象) 将数据持久化到数据库。 Hibe

  • 我有两个实体与单向@OneTo多项映射: 我想获得所有B实体的列表,它们是匹配限制的A实体的子实体。 这就是我卡住的地方:c.list()将返回给我一个对象列表。我不关心A,我想要B。我如何使用Hibernate标准/预测来完成它?如果有关系,我使用Hibernate 4.2.12 在这种简化的情况下,只是急切地去拿是有意义的;在真实的例子中,有一个由四个一对一的单向关联组成的链,我想让所有(或者

  • 尝试获取父实体(Msg)的实体,其中父PK (msg_id)是子实体中的FK时,尝试保持子实体(MsgRetry)时出错。 错误,如:org.hibernate.id.IdentifierGenerationException:试图从null一对一属性分配id 父实体,不需要知道子实体(至少我认为它不需要知道)。一旦子实体被持久化,我就会尝试也持久化父实体。我可以通过在子实体中没有父实体并调用关联

  • 我有一个问题,分离实体传递到持久性。我以为我知道什么是超然的实体,但显然这对我来说太多了...因此,无论如何,我试图创建一个Person对象,该对象具有一个Interviewer对象,而Interviewer对象具有一个Office对象,每次尝试持久化Person时,我都会得到异常(在本例中,Office是分离的实体)。相关代码如下所示: 是帮助器类的静态方法: 您可能会注意到创建面试官的help

  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35