“我可以在不获取用户的情况下保留汽车记录吗?”
是的,这是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的批处理插入是否可以正常工作?”
不,不会。查询将立即执行。
解决方法我在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 IdsCar car = new Car(); //initialization of car’s fields is omittedif (users != null) { car.setPassengers(new HashSet<>(users.size())); users.forEach((user) -> car.getPassengers().add(new Passenger(user,car)));}... .save(car);