【问题标题】:Hibernate : Unknown column in field list休眠:字段列表中的未知列
【发布时间】:2016-10-07 07:03:45
【问题描述】:

我正在尝试像 Hibernate User Guide (2.7.2) 那样建立单向 @OneTaMany 关系,但是当我尝试将以下对象保存在 MariaDB 数据库中时:

Filter filter = new Filter("TLS_A320");
filter.addConstraint(new Constraint(ConstraintType.DEPARTURE, "TLS"));
filter.addConstraint(new Constraint(ConstraintType.AIRCRAFT, "A320"));
session.save(filter);

我遇到了这个异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Filter_idFilter' in 'field list'

这里有 2 个类:

Filter.java

public class Filter {

    @Id
    @Column(name = "idFilter")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "name")
    private String name;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Constraint> constraintList;

    //more code
};

Constraint.java

public class Constraint {

    @Id
    @Column(name = "idConstraint")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "type")
    @Enumerated(EnumType.ORDINAL)
    private ConstraintType constraintType;

    @Column(name = "value")
    private String value;

    //more code
}

这是表格定义:

CREATE TABLE `Constraint` (
    idConstraint INT NOT NULL AUTO_INCREMENT,
    type INT NOT NULL,
    value VARCHAR(10) NOT NULL,

    PRIMARY KEY (idConstraint)
);

CREATE TABLE Filter (
    idFilter INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(50) UNIQUE NOT NULL,

    PRIMARY KEY (idFilter)
);

CREATE TABLE Filter_Constraint (
    idFilter INT UNIQUE NOT NULL,
    idConstraint INT NOT NULL,

    CONSTRAINT fk_Filter_Constraint_Filter FOREIGN KEY (idFilter) REFERENCES Filter(idFilter),
    CONSTRAINT fk_Filter_Constraint_Constraint FOREIGN KEY (idConstraint) REFERENCES `Constraint`(idConstraint)
);

在我看来,Filter 和 Constraint 插入很好,在 Filter_Constraint 表中插入时会发生异常:

DEBUG org.hibernate.SQL - insert into Filter (name) values (?)
DEBUG org.hibernate.id.IdentifierGeneratorHelper - Natively generated identity: 4
DEBUG org.hibernate.SQL - insert into `Constraint` (type, value) values (?, ?)
DEBUG org.hibernate.id.IdentifierGeneratorHelper - Natively generated identity: 5
DEBUG org.hibernate.SQL - insert into `Constraint` (type, value) values (?, ?)
DEBUG org.hibernate.id.IdentifierGeneratorHelper - Natively generated identity: 6
DEBUG org.hibernate.SQL - insert into `Filter_Constraint` (Filter_idFilter, `constraintList_idConstraint`) values (?, ?)
DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a]
DEBUG com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Filter_idFilter' in 'field list'

我对 Hibernate 还很陌生,我只是想不通我做错了什么。

【问题讨论】:

    标签: java mysql sql hibernate


    【解决方案1】:

    您没有在constraintList 上定义任何连接列或反向连接列,因此Hibernate 将自动生成列名,这很可能导致名称Filter_idFilter

    实体名称将成为名称的一部分,因为Constraints可以有一个同名的 id 字段,即idFilter。当然知道情况并非如此,但Hibernate没有(或者至少列名生成代码没有那么复杂),因此它必须假设可以 em> 就是这样。

    连接表名称也是如此,因此您可能希望使用@JoinTable 以及constraintList 上的连接列和反向连接列的定义。但是,既然关系是OneToMany,为什么不添加对Constraint 的反向引用,将过滤器的id 添加到表Constraint 并完全摆脱连接表?

    【讨论】:

    • 所以用户指南中给出的例子不起作用?
    • @bl4ckout 这些示例很可能有效,但您没有正确调整它们。例如,表Person_Phone 中有一个列Person_id,因为实体Person 中的id 列定义为id
    • 我还以为是桌面电话中的Phone_id,我的错。我在约束表和类以及@JoinColumn 中添加了一个引用,它现在可以工作了。非常感谢。
    猜你喜欢
    • 2013-02-10
    • 2014-03-19
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多