2015-05-21 57 views
0

映射我有这些3代表在我的数据库如何将多个单一对多关联在Hibernate中

CREATE TABLE IF NOT EXISTS `User`(
    `id`  INT    NOT NULL AUTO_INCREMENT, 
    `name`  VARCHAR(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE IF NOT EXISTS `Project` (
    `id`  INT    NOT NULL AUTO_INCREMENT, 
    `manager` INT    NOT NULL, 
    `name`  VARCHAR(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`manager`) REFERENCES `User`(`id`) 
) 

CREATE TABLE IF NOT EXISTS `Work`(
    `id`   INT    NOT NULL AUTO_INCREMENT, 
    `project_id` INT    NOT NULL DEFAULT -1, 
    `name`   VARCHAR(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`project_id`) REFERENCES `Project`(`id`), 
    FOREIGN KEY (`creator`)  REFERENCES `User`(`id`) 
) 

然后我想用Hibernate将它们连接起来。

这是我的java类

用户:

// ... import code 
@Entity 
@Table 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @Column 
    private String name; 

    @OneToMany(mappedBy = "manager") 
    private List<Project> projects; 

    public User() { 
    } 
    // ... Getter & Setter code 
} 

项目:

// ... import code 
@Entity 
@Table 
public class Project { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @Column 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "manager") 
    private User manager; 

    public Project() { 
    } 
    // ... Getter & Setter code 
} 

工作:

// ... import code 
public class Work { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @Column 
    private String name; 
    @Column(name = "project_id") 
    private int projectId; 

    @ManyToOne 
    @JoinColumn(name = "creator") 
    private User creator; 

    public Work() { 
    } 
    // ... Getter & Setter code 
} 

现在它可以工作。

但是,在项目和工作(一对多/多对一)映射关系之后,它给了我错误消息。

我映射做的是:

添加这些代码到工程类:

@OneToMany(mappedBy = "project_id") 
private List<Work> works; 

public List<Work> getWorks() { 
    return works; 
} 

public void setWorks(List<Work> works) { 
    this.works = works; 
} 

而且这些代码到工作类:

@ManyToOne 
@JoinColumn(name = "project_id") 
private Project project; 
public Project getProject() { 
    return project; 
} 

public void setProject(Project project) { 
    this.project = project; 
} 

,并删除@Column(name = "project_id") private int projectId;

然后它给了我错误信息:

Exception in thread "main" org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: database.tables.Work.project_id in database.tables.Project.works 
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:768) 
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:728) 
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 

所以我想知道如何映射项目工作的关系。

+1

这可能会帮助你:http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ – jmcg

+1

这也可以帮助你:http://stackoverflow.com/q/24257449/2357233声明:我写了它 – JamesENL

回答

3

在 '工程' 类,代码:

@OneToMany(mappedBy = "project_id") 
private List<Work> works; 

而且,在 '工作' 类,代码:

@ManyToOne 
@JoinColumn(name = "project_id") 
private Project project; 
//var name should match with mappedBy name in other class 

中的名称('的mappedBy =” project_id“)和其他类(私人项目项目)中的变量名称都应匹配。

+0

谢谢,它的工作原理。 但是,变量是Project类(被称为project_id是如此奇怪),所以我更改'@OneToMany(mappedBy =“project_id”)private List works;'to'@OneToMany(mappedBy =“project”)private列表作品;'。 – Shiyou

相关问题