首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对具有唯一约束的3个实体及其关系进行建模?

如何对具有唯一约束的3个实体及其关系进行建模?
EN

Stack Overflow用户
提问于 2019-01-14 14:44:34
回答 1查看 66关注 0票数 0

我有3个实体类。它们是“游戏”,"GameDescription",“语言”。一个游戏可以有许多描述,但一种语言最多只能有一种描述。例如,一个游戏可以有两个描述,一个用英语,一个用法语。这个游戏只能有一个英文描述,其他的可以用其他语言。如何在我的Spring Boot项目中使用Spring Data和JPA对此进行建模?

游戏

id /名称/ gameDescriptions

GameDescription

id / game_id / language_id / text

语言

id /名称

我尝试了游戏和GameDescription实体之间的OneToMany关系,以及GameDescription和语言实体之间的ManyToOne关系,来做这三个实体之间的映射。但它没有提供所需的结果。

游戏实体

代码语言:javascript
运行
复制
@Entity
@Table(name="GAME")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "game")
    private List<GameDescription> descriptions;

    // getters and setters
 }

GameDescription实体

代码语言:javascript
运行
复制
@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
        CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;

    // getters and setters
}

语言实体

代码语言:javascript
运行
复制
@Entity
@Table(name = "LANGUAGE")
public class Language {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "LOCAL_NAME")
    private String localName;

    // getters and setters
}

我需要这3个实体的精细结构,因为每种语言应该只有一个游戏的描述。例如,我期望有一个用5种不同语言描述的游戏。

EN

回答 1

Stack Overflow用户

发布于 2019-01-14 20:14:44

另一种方法是使用使用@Embeddable@EmbeddedId的复合主键。您必须为此修改GameDescription实体,并使用@Embeddable注释创建一个新类。像这样的东西

代码语言:javascript
运行
复制
@Embeddable
public class GameDescriptionId implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "GAME_ID")
    private Game game;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
    CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "LANG_ID")
    private Language language;
    // getters, setters, override equals and hashcode
}

然后修改GameDescription实体

代码语言:javascript
运行
复制
@Entity
@Table(name = "GAME_DESCRIPTION")
public class GameDescription {

    @EmbeddedId
    private GameDescriptionId id;
    private String text;
    // getters setters

}

你可以在这里阅读更多关于https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/的信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54176800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档