我有两个实体之间的简单关联:
public class Car {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
...
}
Run Code Online (Sandbox Code Playgroud)
和
public class User {
@Id
@GeneratedValue
@Column(name = "user_id")
private long userId;
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private Set<Car> cars;
...
}
Run Code Online (Sandbox Code Playgroud)
然后我从客户端获得一些用户ID.例如,userId == 5;
为了节省汽车用户,我需要做下一步:
User user = ... .findOne(userId);
Car car = new Car();
car.setUser(user);
... .save(car);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我可以在没有取用用户的情况下坚持记录汽车记录吗?
与我使用本机SQL查询一样:只需在Car表中插入userId,如string(long).
使用第二个lvl缓存会更快,但在我看来,我不需要做额外的动作.
我不想使用本机查询的主要原因是因为我的项目中有更多难关联,我需要多次.save(car).此外,我不想手动控制查询执行的顺序.
如果我使用session.createSQLQuery("insert into ..... values()"),Hibernate的批量插入工作会正常吗?
如我错了请纠正我.
提前致谢!
更新:
实际上映射类似于:
用户和汽车之间有@ManyToMany关联.但是交叉表也是一个名为Passanger的实体.所以映射是下一个:
public class User{
@OneToMany(fetch = FetchType.LAZY, mappedBy …Run Code Online (Sandbox Code Playgroud) 像/sf/answers/898026881/和/sf/answers/2252893051/这样的答案以及许多其他人提到了一些enitityManager.getReference()方法,可以用来避免对数据库进行不必要的选择查询.
我在 spring boot 应用程序中遇到了类似的问题,当尝试将对象保存到数据库时,使用CRUDRepository. 我的班级看起来像,
class StudentSubject {
String studentId;
@ManyToOne
private Subject subject;
@ManyToOne
private Student student;
}
Run Code Online (Sandbox Code Playgroud)
我必须不必要地find()调用从数据库中获取学生和主题对象,只是将它们传递StudentSubjectRepository给save()他们。但是我已经有了主题和学生的主键。所以我想改用它们,entityManager看起来像我需要的。
但是我不知道这个 entityManager 来自哪里,或者在 Spring Boot 中是否有任何等效的东西。