java - 包含 Map<Entity, Entity> 字段的正确方法是什么

标签 java hibernate dictionary jpa cascade

我有一个实体类 MyEntity 可以与其他 MyEntity 相关联。我想定义 MyEntity 之间的关系。所以我最终得到了一个类

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.HashMap;
import java.util.Map;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Accessors(chain = true)
@Entity
@Table
public class MyEntity {
    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String name;

    private String email;

    private String phone;

    @NonNull
    @OneToOne
    private MyEntityType myEntityType;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Map<String, Address> addresses = new HashMap<>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable()
    private Map<Relationship, MyEntity> relationships = new HashMap<>();

    public MyEntity addAddress(String key, Address address) {
        addresses.put(key, address);
        return this;
    }

    public MyEntity addRelationship(Relationship relationship, MyEntity myEntity) {
        relationships.put(relationship, myEntity);
        return this;
    }
}

关系类的样子

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

import javax.persistence.*;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Entity
@Table
@Accessors(chain = true)
public class Relationship {
    @Id
    @GeneratedValue
    private Long id;
    @NonNull
    private String name;
    @NonNull
    private String antonym;
}

有问题的字段是 MyEntity 中的关系字段。

在我删除 MyEntity 之前,一切似乎都正常。如果删除的 MyEntity 没有任何关系,则一切正常。如果删除的 MyEntity 有关系,那么它相关的 MyEntity 也会被删除。

如果我修改@ManyToMany注解为

    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})

然后不再删除相关的MyEntitys。这看起来像是执行此操作的正确方法吗?

最佳答案

为了正确定义Map<Entity, Entity>映射你需要结合 @ManyToMany (或 @OneToMany ),@JoinTable@MapJoinColumn注释:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(...)
@MapKeyJoinColumn(name = "relationship_id")
private Map<Relationship, MyEntity> relationships = new HashMap<>();

参见 here更多示例。

关于java - 包含 Map<Entity, Entity> 字段的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55773890/

相关文章:

spring - Grails GORM中的树状结构

java - spring-hibernate 花费更多时间的任何原因?

python - 更新Python字典而不覆盖子字典的通用方法

dictionary - 在 Marklogic 的 xquery 库模块中创建全局映射变量

python - 更改字典中的列表会更改所有列表

java - 格式化 double 到 6 位小数精度

java - 使用流查找 Max

java - 没有可用于处理的 EJB 接收器

java - 谁负责 MySQL 和 Hibernate 之间主键的自增?

java - XSD XML 架构中 maxOccurs 的最大整数是多少?