当前位置: 首页 > 知识库问答 >
问题:

当仅设置 id 而不是先从数据库中获取对象时,一对多不会在没有引用的情况下更新

公冶同
2023-03-14

我正在使用 Spring Hibernate 和 JPA。cascade=CascadeType.ALL 和 @Id @GeneratedValue(strategy = GenerationType.IDENTITY)。我有两个表,一个是用户,另一个是照片,当我想添加新照片时,我需要从数据库中获取用户,然后将其设置为照片中的用户 photo.setUser(用户)。有没有办法只做用户用户 = 新用户();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;

共有1个答案

童子明
2023-03-14

使用<code>EntityManager。getReference()获取用户对象。与EntityManager相比,它的优点很好。find()是它不会触发额外的SQL来获取用户对象。

用户对象只是一个仅设置了ID的代理。只需确保在保存前不要访问其ID以外的属性,那么就不会触发额外的SQL来获取用户,这有利于设置具有已知ID的现有对象的外键。

User  user = entityManager.getReference(1, User.class);
photo.setUser(user);
repo.save(photo)

如果使用spring-data repository,等效的方法是< code>getOne(),它将在内部调用< code > entitymanager . get reference()

 类似资料:
  • 问题内容: 我正在使用hibernate4+。 我有两个示例表。 表A 表B 表A(1)-(n)表B关系 我可以不使用连接就在对象B中获取A的ID吗? 像int aid = b.getA()。getId(); // b是B的实例; 尽管在声明类B时可以使用int值而不是A。但是另一个服务层将A与join一起使用。 我可以只获取id(fk)值吗? 请帮忙。 问题答案: 是的,因为代理仍然包含ID。要

  • 问题内容: 我遇到一些与parse.com相关的问题,我想获取特定对象的数据…我已经使用以下代码来获取数据,但似乎已被贬值。 我使用以下代码来获取数据形式的objectId: 这里“ U8mCwTHOaC”是我的objectId,我想获取此objectId的行。谢谢。 问题答案: 如果要从用户表中获取数据。 如果要当前用户的行

  • 问题内容: 在SQL(SQL Server)中,是否可以从表的标识列中检索下一个ID(整数),而实际上无需插入行?如果删除了最近的行,则不一定是最高ID加1。 我之所以这样问,是因为我们有时不得不用新行更新活动数据库。该行的ID在我们的代码中使用(例如,Switch(ID){Case ID:},并且必须相同。如果我们的开发数据库和实时数据库不同步,最好预先预测一个行ID部署之前。 我当然可以 SE

  • 问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。

  • 我在我的应用程序中使用CloudKit作为远程保存数据的一种方式。我的一个记录具有保存图像的CKAsset属性。当我获取记录时,我意识到完成查询要花很多时间。经过多次测试,我得出结论,当您查询记录时,CloutKit会用record对象下载整个资产文件。因此,当您从record对象获取资产并请求它的fileURL时,它会给您一个本地文件路径URL,而不是HTTP类型的URL。这对我来说是一个问题,

  • 通常对象映射器用于将较大的数据集映射到较小的数据集的场景(例如:对象有很多数据,但我们只想返回其中的几个)。 对象映射器通常创建一个小集合的目标对象的新实例,并从具有较大集合的源对象中设置所需字段,但我有相反的场景:我有一个已经包含一些数据的目标对象,现在我需要将具有较小数据集的新源对象映射到目标对象。 源类 目的地类别 DesObj已经包含int i和float f的值,SrcObj有Strin