Hibernate中的@ManyToOne映射无法正常工作

时间:2015-05-25 21:24:01

标签: java hibernate

我有两个类,InviteEvent,带有多对一映射:一个事件有很多邀请。以下是使用Hibernate注释的代码/ SQL的相关代码片段:

db.Events

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| event_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

db.Invites

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| invite_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| name      | varchar(255) | YES  |     | NULL    |                |
| event_fk  | int(11)      | NO   | MUL | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

DbInvite.java

@ManyToOne
private DbEvent event;

public DbInvite() {
}

public DbInvite(String name, DbEvent event) {
    this.name = name;
    this.event = event;
}

// getters and setters

DbEvent.java

@OneToMany(mappedBy = "event")
private Set<DbInvite> invites;

public DbEvent() {
}

public DbEvent(String name) {
    this.name = name;
}

// getters and setters

最后,我 - 这就是大多数Hibernate示例似乎停止的地方 - 我以下列方式创建我的实例:

DbEvent dbEvent = new DbEvent(name);
DbInvite dbInvite = new DbInvite(name, dbEvent);

我收到的错误是:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Unknown column 'event_event_id' in 'field list'

我哪里错了?当主键明确为event_event_id时,event_id来自哪里?

2 个答案:

答案 0 :(得分:1)

您需要为多对一指定连接列,否则默认值由JPA / Hibernate承担。

答案 1 :(得分:0)

当你这样做时:

DbEvent dbEvent = new DbEvent(name);
//the id is setted in when persist into the db
dbEvent = someMethodThatPersistInDb(dbEvent);
//now the object have the id created in the db now insert the other one
DbInvite dbInvite = new DbInvite(name, dbEvent);
someMethodThatPersistInDb(dbInvite); 

我希望可以帮到你,也许你可以发布映射类的其余部分来检查代码。