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

Java 如何在Hibernate中插入外键定义为Long的实体?,java,mysql,hibernate,jpa,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)

我使用的是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`);
@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;

    ...
}
以及定义如下的Java实体:

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`);
@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
我怀疑出现了问题,因为我尝试将外键关系(
建模为
),而不是实体(
其他表
)。我怀疑这是因为如果我注释掉
to
from
字段,Hibernate确实可以持久化这个实体。请注意,数据库中确实存在与
to
from
实体的关系,因此这不是问题所在

如果我尝试使用类似以下内容手动插入,它会起作用:

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

我非常确信,问题不在于坚持长期价值观


你的代码有问题。我敢打赌,您的插入代码中有一个错误的引号。

我非常肯定,问题不在于持久化长值


你的代码有问题。我打赌您的插入代码中有一个错误的引号。

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

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

我不是手工编写insert语句,Hibernate会这样做。因此我想最好发布更多代码。您的存储库类以及调用insert方法的位置。祝你今天愉快。@neil stockton的回答是正确的,问题是逃跑。谢谢你的帮助。没问题=)@JohanI我不是手工编写insert语句的,Hibernate就是这么做的。所以我想最好多发一些代码。您的存储库类以及调用insert方法的位置。祝你今天愉快。@neil stockton的回答是正确的,问题是逃跑。谢谢你的帮助。没问题。@Johan