【问题标题】:Create referenced entity if null with JPA/Hibernate如果为空,则使用 JPA/Hibernate 创建引用实体
【发布时间】:2019-12-05 19:35:00
【问题描述】:

我有这门课:

public class Tenant {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @NaturalId
    @Column(name = "name", nullable = false, updatable = false, unique = true)
    private String name;

    @OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<User> users;

    @OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Role> roles;

    @OneToOne(mappedBy = "tenant", cascade = CascadeType.ALL, orphanRemoval = true, optional = false)
    private TenantLimits limits;
}

当然,所有引用的类都是实体。我可以从这里创建、更新和检索所有内容,但由于private TenantLimits limits; 指的是在创建租户之后创建的实体,因此我的许多租户元素不包含任何匹配的租户限制。

所以我的问题是:当我要检索租户时,如何在数据库中插入 TenantLimits 中的值(如果为空)?在Java中,我可以轻松检查(当然)属性是否为null并手动插入foreach检索,但由于该实体的检索存在于我的代码中的不同位置,如果存在,我将有一些自动管理它的东西

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa


    【解决方案1】:

    您是在告诉 Hibernate Tenant.limits 不能为空,方法是使用“optional=false”映射它。它将 100% 遵守此定义。它只会创建有效的租户,我认为如果数据库的状态无效,它会抛出异常。它不会让您修复数据。

    除了这个特定的 Hibernate 映射之外,您应该通过任何其他方式修复数据库的状态。

    您可能需要分两步进行迁移。比方说,使映射“可选=真”。然后,您可以运行 Java 进程来修复您的数据(也许通过使用实体侦听器)。然后 - 将其改回“optional=false”。

    【讨论】:

    • 我不能为 Hibernate 提供一个对象的默认实例以放在 db 上?
    • 您的请求与数据库不太相关。这听起来像是纯粹的业务逻辑。我不确定,但我不希望我的实体映射器(即 Hibernate)提供这样的功能。
    • 我的意思是,您可以非常直接地将默认对象分配给 Java 中的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多