我正在使用 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
我怀疑出现问题是因为我尝试将外键关系(to
和 from
)建模为 Long
而不是实体(其他表
)。我怀疑这一点,因为如果我注释掉 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 注释信息中的保留字周围添加单引号
关于java - 如何在 Hibernate 中插入外键定义为 Long 的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34741415/