hibernate h2 embeddable list预期“标识符”

时间:2017-10-13 20:15:26

标签: java hibernate h2 embeddable

我正在尝试将一个功能列表(Embeddable)关联到我的员工实体中,而H2似乎对此表示不满意,因为它预期会出现“标识符”

  

引起:org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误“       创建表EMPLOYEE_FUNCTIONS(           EMPLOYEE_EMPLOYEEID VARCHAR(255)NOT NULL,           ACTIVE BOOLEAN NOT NULL,           DEPARTMENTNUMBER INTEGER NOT NULL,           VARCHAR(255),           ORDER [*] INTEGER NOT NULL       )“;期望”标识符“;

事情是我已经用其他项目做了这件事,我不明白为什么它不起作用。

Employee.java

@Entity
public class Employee extends AbstractScheduleEntity<EmployeeSchedule> {
    public static final String ACOMBA_UNIQUE_FIELD = "acombaUnique";

    @Id
    @GenericGenerator(name = "sequence_id", strategy = 
    "ca.tecsar.core.sql.ServerSequenceGenerator")
    @GeneratedValue(generator = "sequence_id")
    @Column(name = "EmployeeID", unique = true, nullable = false)
    private String employeeID;
    @ElementCollection
    private List<Function> functions;

    //getter and setter
}

Function.java

@Embeddable
public class Function implements Serializable {
    private int order;
    private boolean active;
    private String description;
    private int departmentNumber;

    //getter and setter
}

我在Employee中删除了一些不必要的属性。 什么可能导致此错误?是因为我的员工中有一个String作为标识符吗?如果是这样,我如何告诉Hibernate添加Employee_EmployeeID作为标识符? 感谢

10 个答案:

答案 0 :(得分:19)

原来我是愚蠢的,并命名为“秩序”栏目。不知道为什么H2不开心:upside_down:

将变量名称更改为其他名称并且有效!

答案 1 :(得分:1)

订单与实体存在相同的问题。将表名称更改为“ orderz”并继续。

答案 2 :(得分:1)

我遇到了类似的问题,因为我的实体中有一个名为“间隔”的字段。 这篇文章的答案帮助我确定了根本原因,但是更改字段名称对我来说并不是一个解决方案,因为“间隔”对我的班级来说是完美的。

我使用的解决方案是使用 hibernate 注释重命名表列。

 @Column(name = "FREQUENCY_INTERVAL")
 private int interval;

这帮助我在映射到数据库可接受的列名时将变量名保留为“间隔”。

答案 3 :(得分:1)

我也遇到了一个名为 row 的实体字段的问题,因为它也是一个关键字

我指定了一个列名 ("SEAT_ROW") 来绕过它。

@Entity
data class Seat (
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id :            Long,
    @Column(name="SEAT_ROW")
    val row :           Char,
    val num :           Int,
    val price :         BigDecimal,
    val description :   String
) {
    override fun toString(): String = "Seat $row-$num $$price ($description)"
}

H2 Compatibility and Keywords Table

答案 4 :(得分:0)

试着把;在“和测试之前?

答案 5 :(得分:0)

命名字段private String toprivate String from时,我遇到了同样的问题,更改为ex。 dayTo,dayFrom和它起作用。

答案 6 :(得分:0)

我在进行测试的Spring和H2数据库上存在相同的问题,我的实体的字段名称为“ interval” ,我重命名为“ inter” 并解决了该问题

因此,这些错误是由于实体中的sql保留名称而发生的。

答案 7 :(得分:0)

在我的情况下,

原因是插入语句中的语法不正确 问题:

insert into 'table name missing' (column names...) values(values...);

添加表名后

修复:

insert into 'table name specified' (column names...) values(values...);

有时候很难发现琐碎的错误:)

答案 8 :(得分:0)

我遇到了同样的问题,但我的确缺少分号。

答案 9 :(得分:0)

我在 h2 中使用 order 作为表名。更改为 _order 之类的内容,我明白了!

如您所见,here,order 是 h2 的保留字。