繁体   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