gpt4 book ai didi

java - hibernate 持久化实体而不获取关联对象。仅凭身份证

转载 作者:IT老高 更新时间:2023-10-28 20:35:24 27 4
gpt4 key购买 nike

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

My question is:
Can I persist car record without fetching user?

与使用原生 SQL 查询类似:只需在 Car 表中插入 userId,如 string(long)。

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

我不想使用原生查询的主要原因是因为我的项目中有更困难的关联,我需要多次.save(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<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 :

Get an instance, whose state may be lazily fetched.

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

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

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

关于java - hibernate 持久化实体而不获取关联对象。仅凭身份证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com