应为 hibernate h2 可嵌入列表 "identifier"

hibernate h2 embeddable list expected "identifier"

我正在尝试在我的员工实体中关联一个函数列表(可嵌入),而 H2 似乎对这种说法不满意,它期望 "identifier"

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement " CREATE TABLE EMPLOYEE_FUNCTIONS ( EMPLOYEE_EMPLOYEEID VARCHAR(255) NOT NULL, ACTIVE BOOLEAN NOT NULL, DEPARTMENTNUMBER INTEGER NOT NULL, DESCRIPTION VARCHAR(255), ORDER[*] INTEGER NOT NULL ) "; expected "identifier";

问题是我已经在其他项目中这样做了,但我不明白为什么它不起作用。

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 中删除了一些不必要的属性。 什么可能导致此错误?是因为我的员工中有一个字符串作为标识符吗?如果是这样,我如何告诉 Hibernate 添加 Employee_EmployeeID 作为标识符? 谢谢

尝试将 ;在 " 和测试之前 ?

原来我是个笨蛋,给一个专栏取了个名字"Order"。想知道为什么 H2 不开心:upside_down:

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

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

我在 Spring 和 H2 数据库测试时遇到了同样的问题,我的实体有字段名称 "interval",我重命名为 "inter" 并解决了问题。

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

Order as entity 也有同样的问题。将 table 名称更改为“orderz”并继续。

在我的案例中,问题的原因是插入语句中的语法不正确 问题:

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

添加 table 名称后

修复:

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

有时很难发现微不足道的错误:)

我遇到了同样的问题,但我的却少了一个分号。

由于我的实体中有一个名为“间隔”的字段,我遇到了类似的问题。 这个 post 的答案帮助我确定了根本原因,但是更改字段名称对我来说不是解决方案,因为“间隔”非常适合我的 class.

我使用的解决方案是使用休眠注释重命名 table 列。

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

这帮助我将变量名称保持为 'interval',同时映射到数据库接受的列名称table。

我还遇到了一个名为 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

我在 h2 中使用订单作为 table 名称。更改为类似 _order 的内容,我明白了!

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