【问题标题】:How to map multiple One-to-Many association in Hibernate如何在 Hibernate 中映射多个一对多关联
【发布时间】:2015-08-02 11:33:08
【问题描述】:

我的数据库中有这 3 个表

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

并将这些代码放入Work类:

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

所以我想知道如何映射 Project-Work 的关系。

【问题讨论】:

标签: java hibernate annotations one-to-many


【解决方案1】:

在'Project'类中,代码为:

@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") 中的名称和另一个类(私有项目项目)中的变量名都应该匹配。

【讨论】:

  • 谢谢,它有效。但是变量是Project类(叫project_id好奇怪),所以我把@OneToMany(mappedBy = "project_id") private List&lt;Work&gt; works;改成@OneToMany(mappedBy = "project") private List&lt;Work&gt; works;
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多