Hibernate从一对多连接中获取一列

时间:2015-08-23 11:16:09

标签: java hibernate

我想创建一个java类,它只包含一个来自OneToMany ManyToOne等列的列,而不是整行。

我该怎么做?

(我不确定我能表达自己,所以我做了一个例子)

TABLE e_skill
(
    id int NOT NULL AUTO_INCREMENT,
    skill_name VARCHAR (20) NOT NULL,
    PRIMARY KEY (id)
);

TABLE t_person
(
    id int NOT NULL AUTO_INCREMENT,
    user_id int NOT NULL,
    primary_skill int,
    PRIMARY KEY (id),
    FOREIGN KEY (primary_skill) REFERENCES e_skill(id)
);

TABLE t_secondaryskills
(
    id int NOT NULL AUTO_INCREMENT,
    t_person_id int NOT NULL,
    skill_name int NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (t_person_id) REFERENCES t_person(id),
    FOREIGN KEY (skill_name) REFERENCES e_skill(id)
);

public enum Skill {
    ...
}

@Entity
@Table(name = "t_person")
public class Employee {
    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne
    @Enumerated(EnumType.STRING)
    //????????
    //get skill_name column from e_skill
    //????????
    private Skill primarySkill;

    @OneToMany
    @Enumerated(EnumType.STRING)
    //????????
    //get skill_name column from e_skill
    //????????
    private Set<Skill> secondarySkills;

    //getters setters
}

我现在唯一可以做的就是创建一个实体来代表e_skill表,我想避免这样做,因为我只需要一列。

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,由于辅助技能(因为它是一个集合),你不能做你想做的事。您只能使用@SecondaryTable annotation来映射主要技能名称。

当您使用ORM映射内容时,我只想在此场景中使用列,因为您正在映射对象,并且通常在您的对象中#39;想要复制数据(除非它们在您的域模型之外)。如果这对你来说是不可接受的,我建议你看一下像myBtais这样的其他工具,它可以让你完全控制你得到的数据。

如此底线,将您的技能映射为实体,即使它有很多列,也可以选择其他工具(但不是ORM)。