0

I have these 3 tables in my database

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

Then I want to use Hibernate to connect them.

These are my java classes

User:

// ... 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
}

Project:

// ... 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
}

Work:

// ... 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
}

Now it can work.

However, after the relation of Project and Work (One to Many / Many to One) mapped, It gives me error message.

What I do for mapping is :

add these code into Project class:

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

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

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

And these code into Work class:

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

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

and remove @Column(name = "project_id") private int projectId;

Then it gives me error message:

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)

So I want to know how I can map the relation of Project-Work.

Shiyou
  • 121
  • 1
  • 4
  • 16
  • 1
    This might help you: http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ – jmcg May 21 '15 at 03:37
  • 1
    This might also help you: http://stackoverflow.com/q/24257449/2357233 DIsclaimer: I wrote it – JamesENL May 21 '15 at 04:04

1 Answers1

3

In the 'Project' class, the code is:

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

And, in the 'Work' class, the code is:

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

The names in ('mappedBy="project_id") and the variable name in the other class (private Project project) both should match.

anish
  • 482
  • 2
  • 8
  • Thank you, it works. However, the variable is Project class (to be called project_id is so strange), so I change `@OneToMany(mappedBy = "project_id") private List works;` to `@OneToMany(mappedBy = "project") private List works;`. – Shiyou May 21 '15 at 05:26