Java 休眠持久化实体而不获取关联对象。凭身份证

Java 休眠持久化实体而不获取关联对象。凭身份证,java,hibernate,Java,Hibernate,我有两个实体之间的简单关联: public class Car { ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; ... } 及 我的问题是:我可以在不获取用户的情况下保存汽车记录吗 与使用本机SQL查询类似:只需在Car表中插入类似userId的字符串(long)。 第二级缓存会更快,但我认为我不需要做额外的动作我不

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

public class Car {

    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    ...

}

我的问题是:
我可以在不获取用户的情况下保存汽车记录吗

与使用本机SQL查询类似:只需在Car表中插入类似userId的字符串(long)。

第二级缓存会更快,但我认为我不需要做额外的动作

我不想使用本机查询的主要原因是,我的项目中有更困难的关联,我需要多次.save(car)。另外,我不想手动控制查询执行的顺序。

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



如果我错了,请纠正我。

提前谢谢!

更新:

实际上,映射类似于:

用户和汽车之间存在@manytomy关联。但交叉表也是一个名为Passanger的实体。因此,接下来是映射:

public class User{
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", targetEntity = Passenger.class)
    private Set<Passenger> passengers;
}
汽车实体:

public class Car {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "car", targetEntity = Passenger.class, cascade = CascadeType.ALL)
    private Set<Passenger> passengers;
}
公车{
@OneToMany(fetch=FetchType.LAZY,mappedBy=“car”,targetEntity=Passenger.class,cascade=CascadeType.ALL)
私家车乘客;
}
代码:

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);
列出用户=。findinuserid(userid);//查找userId位于userId中的用户记录-具有用户id的集合
汽车=新车()//省略了car字段的初始化
如果(用户!=null){
car.setpassers(新的HashSet(users.size());
users.forEach((用户)->car.getPassengers().add(新乘客(用户,汽车));
}
... .拯救(汽车);
“我可以在不获取用户的情况下保留车辆记录吗?”

是的,这是Hibernate代理的优点之一:

User user = entityManager.getReference(User.class, userId); // session.load() for native Session API  
Car car = new Car();
car.setUser(user);
这里的关键点是使用:

获取一个实例,该实例的状态可能是延迟获取的

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

“如果我使用session.createSQLQuery(“插入到…..值()”),Hibernate的批插入工作正常吗?”


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

Hibernate用户可以实现此方法:

public <T extends Object> T getReferenceObject(Class<T> clazz, Serializable id) {
        return getCurrentSession().get(clazz, id);
    }
您可以根据实体模型将id类型更改为整数或长。
或者,如果所有实体都有一个基类,则可以从BaseEntity继承T。

如果有人在使用spring JPA,则可以使用该方法在spring JPA中执行相同的操作


您是否显示了精确的映射?从
汽车
用户
?@DraganBozanovic,我已经更新了帖子。是的,有瀑布。你说得对。但如果你允许的话,我还有一个问题。我无法调用.merge(car),因为异常:分离的实体传递给persist了吗?调用saveOrUpdate()不是一个选项,因为我需要removeOrphan。我建议您为此提出一个不同的问题,因为这似乎是一个不同的问题。在那里发布异常的整个堆栈跟踪,以便我们知道哪个实体被分离,等等,我提出了一个新问题。请访问eclipselink,您根本不必获取参考资料。这是在途中处理的。可以用同样的方法配置hibernate吗?
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);
User user = entityManager.getReference(User.class, userId); // session.load() for native Session API  
Car car = new Car();
car.setUser(user);
public <T extends Object> T getReferenceObject(Class<T> clazz, Serializable id) {
        return getCurrentSession().get(clazz, id);
    }
MyEntity myEntity = getRefererenceObject(MyEntity.class, 1);