我将Spring Hibernate与JPA结合使用。级联= CascadeType.ALL和@Id @GeneratedValue(策略= GenerationType.IDENTITY)。我有两个表,一个是用户,另一个是照片,当我想添加新照片时,我需要从数据库中获取用户,然后使用photo.setUser(user)将其设置为照片中的用户。有没有一种方法可以做到User user = new User(); user.setId(1),然后在没有完整引用的情况下将其与photo.setUser()放入照片中,当我仅设置id时执行repo.save(photo)时,我将传递分离的实体以持久化。 >
我想做的是:
User user = new User();
user.setId(1);
photo.setUser(user);
repo.save(photo)
已经在数据库中创建了用户并且有几张照片的地方。
代替:
User user = repo.findUserById(1);
photo.setUser(user);
repo.save(photo);
我的实体:
@Entity
@Table(name = "users")
public class Photo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "user", fetch = FetchType.EAGER)
private List<Photo> photos = new ArrayList<>();
@Entity
@Table(name = "photos")
public class Photo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
答案 0 :(得分:2)
使用EntityManager.getReference()
获取用户对象。与EntityManager.find()
相比,它的好处是它不会触发其他SQL来获取用户对象。
用户对象只是设置了ID的代理。只需确保在保存之前不要访问ID以外的属性,那么就不会触发其他SQL来吸引用户,这对于设置具有已知ID的现有对象的外键非常有用。
User user = entityManager.getReference(1, User.class);
photo.setUser(user);
repo.save(photo)
如果您正在使用spring-data存储库,则等效方法为getOne()
,它将在内部调用EntityManager.getReference()