OneToOne和JoinTable

时间:2014-07-04 14:09:30

标签: java hibernate jpa one-to-one

我正在尝试将JPA Enity Site 与另一个JPA实体( Address )关联,并且具有单向一对一关系,但我无法让它工作。 一个复杂因素是拥有关系(Site)的实体是抽象的,它由另一个实体实现,即 Museum 。 另一个复杂因素是抽象实体继承自第三个实体,仍然是抽象的,即IdentifiableEntity。

以下是代码:

网站:

@Configurable
@Entity
public abstract class Site extends IdentifiableEntity {

@NotNull
@OneToOne
@JoinColumn(name = "address_id")
private Address address;

public Address getAddress() {
    return this.address;
}

public void setAddress(Address address) {
    this.address = address;
}
}

地址:

@Configurable
@Entity
public class Address extends IdentifiableEntity {

@NotNull
private String street;

private String number;
}

馆:

@Configurable
@Entity
public class Museum extends Site {
    /* some stuff */
}

对于每个实体,我创建了一个JPARepository。

在部署期间,似乎不存在任何错误,但是当尝试通过在SiteRepository上调用findAll(即扩展JPARepository的接口)来访问数据库时,我得到以下运行时错误堆栈:

HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.orm.jpa.JpaSystemException: 
org.hibernate.exception.SQLGrammarException: 
    could not extract ResultSet; 
    nested exception is javax.persistence.PersistenceException: 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet

root cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'site0_.address' in 'field list'

1 个答案:

答案 0 :(得分:2)

尝试为@OneToOne关系定义连接列,例如:

@OneToOne @JoinColumn(name="address_id")
private Address address;

如果您没有明确定义连接列,则默认为变量的名称,我认为这就是您收到消息Unknown column 'site0_.address'的原因。

当然还要确保表中存在连接列(除非您使用hibernate.hbm2ddl.auto=update)。