2016-04-06 8 views
2

どこにでも例が表示されないので、これが可能かどうかわかりません。しかし、基本的に、私はJSR-0038 JPA仕様によるとJPA:マップ<Entity1、Set <Entity2>>が可能ですか?

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; 

} 
+0

を使用して、すべての労働者のスキルにアクセスすることができますあなたはそれが可能でない理由を説明して理解するだろうか? –

+0

スキルはワーカーごとに1つの唯一の評価にマップされていますか?もしそうなら、あなたはなぜマップが必要でしょうか? – KumarM

+0

@YairZaslavsky私は説明を理解できました –

答えて

1

にエンティティ内のフィールドをバインドすることができるかどうかを確認しようとしています。マップを使用する場合は、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>に追加しますそれの価値。

+0

私はこのアイデアが気に入っていますが、スキル+評価は作業者に関連付けられている場合にのみ意味があります。 –

+0

作業者が多くのスキルを持っている場合、Workerクラスにフィールドがある場合、この構成を持つことに問題はありません。 – Koitoer

0

それはあなたの評価表が不要であるように見えます

をマップであなたの質問に答えるけど...いない可能性があります。

あなたは代わりに私がWorkerSkillテーブルに格付け情報を移動

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) 
); 

注意を持つことができます。

次にあなたがあたり

@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();

+0

私もその結論に達しました。スキルはありますが、レーティング/レビューはまだない労働者を表現するにはどうしたらいいですか? –

+0

この場合、WorkerSkillをnullのスコアに変更する必要があります。または、あなたはすべて0から始まると仮定することができます。 – Desorder

+0

上記のアプローチに問題があります。これは、スキルとレーティングの組み合わせをすべてロードします。私はスキルの両方の小さなセットで取得することができ、そのスキルの総合評価スコアを生成する必要があります。 –

関連する問題