我正在尝试将JPA实体站点与具有单向一对一关系的另一个JPA实体(地址)相关联,但是我无法使其正常工作。
复杂之处在于拥有关系(站点)的实体是抽象的,并且由另一个实体(即博物馆)实现。
更复杂的是,抽象实体从仍然是抽象的第三实体(即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(即扩展JPARepository的接口)上调用findAll访问数据库时,出现以下运行时错误堆栈:

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'

最佳答案

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

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


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

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

10-06 16:04