【问题标题】:hibernate h2 embeddable list expected "identifier"hibernate h2 可嵌入列表预期的“标识符”
【发布时间】:2018-03-26 00:48:21
【问题描述】:

我正在尝试在我的 Employee 实体中关联一个函数列表(可嵌入),而 H2 似乎对它期望一个“标识符”的说法不满意

原因:org.h2.jdbc.JdbcSQLException: SQL 语句中的语法错误“ 创建表 EMPLOYEE_FUNCTIONS ( EMPLOYEE_EMPLOYEEID VARCHAR(255) 非空, 活动布尔非空, DEPARTMENTNUMBER 整数非空, 描述 VARCHAR(255), ORDER[*] 整数非空 ) "; 预期的 "标识符";

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

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
}

函数.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 作为标识符? 谢谢

【问题讨论】:

    标签: java hibernate h2 embeddable


    【解决方案1】:

    原来我是愚蠢的,并命名了一个列“订单”。想知道为什么 H2 不开心 :upside_down:

    将变量名称更改为其他名称,它起作用了!

    【讨论】:

    • ORDER 是 H2DB 的保留关键字 - h2database.com/html/advanced.html#compatibility
    • 是的,我明白了。
    • @Enumerated(EnumType.ORDINAL) private RaceGroup group GROUP也会导致同样的问题。 :P
    • 我也遇到了这个问题,但在我的情况下,保留字是offset。重命名列有帮助。
    • 有同样的问题,在我的情况下,它是导致问题的“发件人”字段,所以我必须指定 @Column(name = "from_date") 以避免与保留字冲突。
    【解决方案2】:

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

    【讨论】:

    • 正是我的情况,我有 fromuntil 日期,这打破了我的查询。将它们重命名为 fromDateuntilDate 解决了这个问题。
    【解决方案3】:

    Order 作为实体遇到了同样的问题。将表名更改为“orderz”并继续。

    【讨论】:

    • 这个!我花了一个小时才弄清楚。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 查询是由 Hibernate 而不是我生成的
          【解决方案8】:

          在我的情况下,问题原因是插入语句中的语法不正确 问题:

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

          添加表名后

          修复:

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

          有时候,小错误很难发现 :)

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 这似乎更像是评论而不是答案。你能提供一些代码的例子吗?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-07-06
              • 2021-03-08
              相关资源
              最近更新 更多