使用Hibernate持久化实体,而不获取关联对象,只通过id进行操作。

12 浏览
0 Comments

使用Hibernate持久化实体,而不获取关联对象,只通过id进行操作。

我有两个实体之间的简单关联:

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 cars;
    ...
}

然后我从客户端获取一些用户ID。例如,userId == 5;

要保存与用户关联的车辆,我需要执行以下操作:

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

我的问题是:

我能在不获取用户的情况下持久化车辆记录吗?

类似于使用原生SQL查询的方式:在Car表中插入像字符串(long)的userId。

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

我不想使用原生查询的主要原因是因为我的项目中有更复杂的关联关系,我需要多次保存(car)。而且,我不想手动控制查询执行顺序。

如果我使用session.createSQLQuery("insert into .....values()"),Hibernate的批量插入会正常工作吗?

如果我有错误,请纠正我。

提前感谢!

更新:

实际上,映射类似于:

User和Car之间有@ManyToMany关联。但交叉表也是一个实体,例如Passanger。所以映射如下:

public class User{
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", targetEntity = Passenger.class)
    private Set 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;
    ... 其他字段 ...
}

Car实体:

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

代码如下:

List users = ... .findInUserIds(userIds); // 查找userId在userIds集合中的用户记录
Car car = new Car();       // 省略了car字段的初始化
if (users != null) {
    car.setPassengers(new HashSet<>(users.size()));
    users.forEach((user) -> car.getPassengers().add(new Passenger(user, car)));
}
... .save(car);

0