在JPA中是否可以仅用2个表来表示Entity的字段Map〈Enum,Entity>?

cnh2zyt3  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(137)

给定:

enum Language
    {
        EN
        DE
        IT
        FR
    }

    @Entity
    @Table(name = "translation")
    class Translation
    {
        Long entry_id; // mapped to Entry
        Language language; // creates primary key with entry_id
        String content;

        // more fields ...
    }

    @Entity
    @Table(name = "entry")
    class Entry
    {
        Long id;
        Map<Language, Translation> translations;

        // more fields ...
    }
  1. JPA 3.1和Hibernate 6.1.5+是否允许仅使用2个表在关系数据库(MySQL)中表示上述内容,例如:
table entry (id, stuff)
    table translation (entry_id, language, content) primary key [entry_id, language]

1.还考虑对上述问题的扩展,其中内容是另一个@ManyToOne关系:

@Entity
    @Table(name = "translation")
    class Translation
    {
        Long entry_id; // mapped to Entry
        Language language; // creates primary key with entry_id
        List<Post> posts;
    }
    
    @Entity
    @Table(name = "post")
    class Post
    {
        Long id;
        String content;
    }

为了拥有所有世界中的大多数世界,人们将如何实现这一点:

  • 在Java端Map〈语言,翻译〉
  • 数据库端的表数量最少,以避免执行无意义的连接
  • 最佳读/写(理想情况下是懒惰的),这样Map〈Language,Translation〉的值不会从DB中读取,除非必要(只有Key是已知的),尤其是不会在每次只有一个条目改变时写入(这就是为什么我们有键,不是吗?)
k2fxgqgv

k2fxgqgv1#

很简单:

enum Language
{
    EN
    DE
    IT
    FR
}

@Embeddable
class Translation
{
    String content;

    // more fields ...
}

@Entity
@Table(name = "entry")
class Entry
{
    Long id;
    @ElementCollection
    @CollectionTable(name = "translation")
    @MapKeyEnumerated(EnumType.STRING)
    @MapKeyColumn(name = "language")
    Map<Language, Translation> translations;

    // more fields ...
}

相关问题