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

如何避免在不需要时更新或创建子实体

章涵蓄
2023-03-14

我是实体框架的新手,所以如果这看起来很傻,请原谅我。

请考虑以下 json 对象:

{
    "id": "8850a2d2-230e-8ecb-cbb8-06068df136aa",
    "fiscalCode": "QHNMPN27E68F765S",
    "role": {
        "id": "MED",
        "name": "Medico di base"
    },
    "enabled": true,
    "name": "Alessio",
    "surname": "De Padova",
    "contacts": [],
    "specs": [
        {
            "name": "Fisiatria",
            "id": "FISIA"
        },
         {
            "name": "Cardiologia",
            "id": "CARD"
        }
    ],
    "account": {
        "id": "5541",
        "email": "alessandro.spaghetti@gmail.com"
    },
    "submit": null
}

让我们假设我们将其作为请求正文发送,以便在数据库中更新它。它是具有子实体的用户,如下所示:

@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;

@Column(name = "name")
@NotNull(message = "Name cannot be null")
@Size(min = 1, message = "Name is not long enough")
private String name;

@Column(name = "fiscal_code")
@NotNull(message = "Fiscal code cannot be null")
@Size(min=16, max=16, message = "Fiscal code has to be 16 chars long")
private String fiscalCode;

@Column(name = "enabled")
private Boolean enabled;

@Column(name = "surname")
@Size(min = 1, message = "Surname is not long enough")
@NotNull(message = "Surname cannot be null")
private String surname;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "account_id")
private AccountEntity account;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "role_id")
private RoleEntity role;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private Set<ContactEntity> contacts;

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
        name = "users_specs",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "spec_id")
)
private Set<SpecEntity> specs;

现在,问题来了。虽然我希望用户能够创建一个新帐户(或联系人)或更新现有帐户(就像现在发生的那样),但我不希望规范发生同样的事情。html" target="_blank">用户只能添加或删除规范,无权创建新规范或更改规范的属性。

配置这种行为的正确方法是什么?

以下代码显示了我主要使用配置想要做的事情:

  userEntity.setSpecs(
            userEntity
                    .getSpecs()
                    .stream()
                    .map(spec -> specSvc.get(spec.getId()))
                    .collect(Collectors.toSet())
    );

我正在做的是“纠正”客户端发送的每个规范实体。通过更正,我的意思是阻止名称(或任何其他类型的属性)更改,以便用户只能添加或删除规范。但不能更新或创建它们。如果服务器收到不包含 id 的规范,它将引发错误

共有1个答案

公冶弘壮
2023-03-14

一般情况下,不要让用户直接发布你的实体。这样无论如何都会导致以后各种不同的问题。仅在您的示例中,如果用户客户端可以设置数据库id,这种情况并不常见。如果你曾经让用户更新他们自己的帐户,你可能不希望他们能够设置一个角色。

我会创建一些 DTO 对象,然后手动映射或使用一些映射器将这些对象映射到 JPA 实体。

在如何在考虑可扩展性的同时将域实体正确转换为DTO中有一些不同的方法

 类似资料:
  • 垃圾回收期在管理内存方面非常出色,它非常高效地移除不再使用的对象。但是无论你如何看待它,分配和销毁一个基于堆内存的对象花费处理器时间比分配和销毁不是基于堆内存的对象要多。在函数内创建大量的引用类型对象会引入严重的性能消耗问题。 所以不能让垃圾回收器超负荷工作。你可以借鉴一些简单的技巧最小化垃圾回收器的工作。所有的引用类型对象,即使是局部变量,都被分配存储在堆内存上。每个引用类型的局部变量在函数结束

  • 我正在进行一项活动,其中有TabLayout和两个表示选项卡内容的片段。我在活动的OnCreate方法中手动管理打开选项卡的当前状态: 这只是一个简单的例子。我真正的代码是用C语言编写的,并且有一些其他逻辑来存储和管理活动重启之间的状态。 配置更改时的问题(例如开关方向): 打开的碎片被摧毁 活动被破坏 活动重启 在onCreate方法中,当调用super.onCreate(savedInstan

  • 我正在尝试更新此代码以处理Discord。jsv12。我遇到了一个错误,我有点困惑于如何修复这个错误。我已经更新了一些代码来处理Discord。jsv12。 client.channels.fetch... 在客户端。(/home/runner/Log/index.js:44:40)在客户端。在客户端发出(events.js:314:20)。事件发射器。在MessageCreateAction处发

  • 我正在尝试构建一个避免不必要的批量的docker映像,并且遇到了一个我认为应该很常见的问题,但是到目前为止我还没有找到一个直截了当的解决方案。(我正在Ubuntu18.04系统上构建docker,从ubuntu层的

  • 我使用struts2和hibernate创建了一个应用程序,该应用程序将excel文件上传到数据库中,并执行其他CRUD操作。然而,现在出现了一个更改要求,用户应该能够从UI控制数据库模式,这意味着每当excel文件在数据库中有新列时,用户应该能够通过用户界面动态添加新列。 我不知道如何才能做到这一点,因为更新数据库仍将保持实体类不变。 为了说明这个问题,请考虑以下情况:我有一个员工的ab exc

  • 问题内容: 我有一个带有标题的表,一个带有输入字段的行,一个带有数据的行。像这样。http://brow.hu/sitegen/stackoverflow_table_example.png 如果有人在输入字段中输入内容,我想使用ajax查询过滤数据。收到新表后,我更改了旧表的内容: 并闪烁。如何避免呢? 问题答案: 避免闪烁的一种方法称为双缓冲。在Ajax中,只需两个div占用相同的空间即可完成