微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hibernate持久化实体而无需获取关联对象仅凭身份证

如何解决Hibernate持久化实体而无需获取关联对象仅凭身份证

“我可以在不获取用户的情况下保留汽车记录吗?”

是的,这是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 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。