我在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