Java 如何在Hibernate中插入外键定义为Long的实体?
我使用的是Hibernate 3.6.8,我在mysql(5.5)中定义了一个表,如下所示: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)
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