簡體   English   中英

JPA:是地圖<Entity1,Set<Entity2> &gt; 可能嗎?

[英]JPA: Is Map<Entity1,Set<Entity2>> possible?

我在任何地方都沒有看到示例,所以我不確定這是否可行。 但基本上,我想看看是否可以將實體中的字段綁定到

   Map<Skill,Set<Rating>> ratings;


CREATE TABLE Worker (
  ID         BIGINT PRIMARY KEY,

);

CREATE TABLE Skill (
  ID   BIGINT PRIMARY KEY,
  name VARCHAR(32) NOT NULL,
  UNIQUE (name)
);

CREATE TABLE WorkerSkillRating (
  ID       BIGINT PRIMARY KEY,
  WorkerID BIGINT NOT NULL,
  SkillID  BIGINT NOT NULL,
  Rating   INT,
  FOREIGN KEY (WorkerID) REFERENCES Worker (ID),
  FOREIGN KEY (SkillID) REFERENCES Skill (ID),
  FOREIGN KEY (Rating) REFERENCES Rating (ID)
);

CREATE TABLE Rating (
  ID       BIGINT PRIMARY KEY,
  score    TINYINT NOT NULL,
  comments VARCHAR(256)
);

實體

@Entity
public class Skill {

    @Id
    private Long id;

    private String name;


    public Skill(String name) {
        this();
        this.name = name;
    }

    public Skill() {
        this.id = Math.abs( new Random().nextLong());
    }

}


@Entity
public class Worker {

    @Id
    private Long id;

    // The open question
    public Map<Skill, Set<Rating>> ratings;

}

@Entity
public class Rating {

    @Id
    private Long id;
    private Byte score;
    private String comments;

}

根據 JSR-0038 JPA 規范。 使用 Map 時,只允許以下組合:Basic Type、Entities 和 Embeddables。

Map<Basic,Basic> 
Map<Basic, Embeddable> 
Map<Basic, Entity>

Map<Embeddable, Basic> 
Map<Embeddable,Embeddable>
Map<Embeddable,Entity> 

Map<Entity, Basic>
Map<Entity,Embeddable>
Map<Entity, Entity> 

我認為以您想要的方式進行可能的映射並沒有什么大不了的,但這超出了規范,並且大多數提供商都遵循它們,我認為這種映射根本不是很常見。

“工人有很多技能,他可能在一項技能上得到了很多評級。”

然后在技能類中添加一個Set<Ratings> ,而不是直接嵌套在地圖中作為它的值。

它可能無法用地圖回答您的問題,但是...

看起來您的評分表是不必要的。

你可以改為

CREATE TABLE Worker (
  ID         BIGINT PRIMARY KEY,
);

CREATE TABLE Skill (
  ID   BIGINT PRIMARY KEY,
  name VARCHAR(32) NOT NULL,
  UNIQUE (name)
);

CREATE TABLE WorkerSkill (
  ID       BIGINT PRIMARY KEY,
  WorkerID BIGINT NOT NULL,
  SkillID  BIGINT NOT NULL,
  score    TINYINT NOT NULL,
  comments VARCHAR(256)
  FOREIGN KEY (WorkerID) REFERENCES Worker (ID),
  FOREIGN KEY (SkillID) REFERENCES Skill (ID)
);

注意我將評級信息移至 WorkerSkill 表。

然后你可以按照下面的映射你的實體

@Entity
public class Skill {

    @Id
    private Long id;

    private String name;

    // Getter setters const etc

}

@Entity
public class WorkerSkill {

    @Id
    private Long id;

    private int score;

    private String comments;

    @ManyToOne
    private Skill skill;

    @ManyToOne        
    private Worker worker;

    // Getter setters const etc

}


@Entity
public class Worker {

    @Id
    private Long id;

    @OneToMany
    public List<WorkerSkill> workerSkills = new ArrayList<>();

    // Getter setters const etc

}

然后你可以使用worker.getWorkerSkill();訪問所有工人的技能worker.getWorkerSkill();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM