java - 如何在 Hibernate 中插入外键定义为 Long 的实体?

标签 java mysql hibernate jpa

我正在使用 Hibernate 3.6.8,并且我在 mysql (5.5) 中定义了一个表,如下所示:

CREATE TABLE mytable
(
    id BIGINT(20) PRIMARY KEY NOT NULL,
    version INT(11),
    description VARCHAR(60),
    scheduled_at DATETIME,
    `from` BIGINT(20),
    `to` BIGINT(20),
    deleted BIT(1) DEFAULT b'0',
    completed BIT(1) DEFAULT b'0',
    delete_from_after_completion BIT(1) DEFAULT b'0',
    CONSTRAINT FK14F71A73C588I54F FOREIGN KEY (`from`) REFERENCES other_table (id),
    CONSTRAINT FK14F71C231C45J198 FOREIGN KEY (`to`) REFERENCES other_table (id)
);
CREATE INDEX FK14F71A73C588I54F ON mytable (`from`);
CREATE INDEX FK14F71C231C45J198 ON mytable (`to`);

Java 实体定义如下:

@Entity
public class MyTable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    @Version
    @Column(name = "version")
    private Integer version;
    @Column(name = "description")
    private String description;
    @Column(name = "scheduled_at")
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "SM")
    private Date scheduledAt;
    @Column(name = "from")
    private Long fromId;
    @Column(name = "to")
    private Long toId;
    @Column(name = "deleted")
    private boolean deleted;
    @Column(name = "completed")
    private boolean completed;
    @Column(name = "delete_from_after_completion")
    private boolean deleteFromEntityAfterCompletion;

    ...
}

当我尝试使用有效值持久化 MyTable 的实例时,最终出现以下错误:

2016-01-12 10:06:33,443 [qtp2139431292-20] WARN  org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
2016-01-12 10:06:33,443 [qtp2139431292-20] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from, scheduled_at, to, version) values (0, 1, 0, 'Test', 10, '2016-01-13 00:00:' at line 1

我怀疑出现问题是因为我尝试将外键关系(tofrom)建模为 Long 而不是实体(其他表)。我怀疑这一点,因为如果我注释掉 tofrom 字段,Hibernate 确实可以保留该实体。请注意,与 tofrom 实体的关系确实存在于数据库中,因此这不是问题。

如果我尝试使用类似的方法手动插入,它会起作用:

insert into mytable values(3, 0, "desc", '2016-10-10 00:00:', 10, 11, 0, 0, 0);

最佳答案

您有一列是 SQL 保留关键字(“from”),Hibernate 不会为您引用它。其他 JPA 实现(例如 DataNucleus JPA)会为您处理这些事情。您必须在 JPA 注释信息中的保留字周围添加单引号

关于java - 如何在 Hibernate 中插入外键定义为 Long 的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34741415/

相关文章:

java - 我在使用 javamail + glassfish 4 发送电子邮件时遇到问题

java - 两个线程等待时非法监视器状态异常

mysql - 如果行值对同一个人 ID 重复,我需要在不同的列中显示行值

java - 如何与 OpenSessionInViewInterceptor 结合重新打开 Spring session

java - Hibernate - 从单向 OneToMany 关系中获取集合的 HQL

java - json volley 显示错误 android

java - Spring 调度任务 - 只运行一次

Mysql 是否不同

MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表

java - Hibernate手动删除特定的多对多关联