所以我使用mysql 8.0和hibernate 5.4.25,这是目前hibernate最稳定的版本,下面是我编写的创建外键的代码
@Entity
@Table(name="Instructor")
public class Instructor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="e_id")
private int e_id;
@Column(name="name")
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "detail_id",referencedColumnName = "d_id",
foreignKey = @ForeignKey(name="fk_detail", value = ConstraintMode.PROVIDER_DEFAULT))
private InstructorDetails detail;
}
这是我的另一个实体类
@Entity
@Table(name="InstructorDetails")
public class InstructorDetails {
@OneToOne(mappedBy = "detail",cascade = CascadeType.ALL)
private Instructor instructor;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "d_id")
private int d_id;
@Column(name = "age")
private int age;
@Column(name = "branch")
private String branch;
@Column(name = "hobby")
private String hobby;
@Column(name = "dept")
private String dept;
}
当然,我在实体类中有所有必需的setter、getter和constructor,我在这里没有包括它们,所以这个问题仍然很紧凑
这里的问题是我在我的hibernate配置文件中包含了show\u sql属性true,它向我显示了下面的ddl命令已经执行
create table Instructor (
e_id integer not null auto_increment,
name varchar(255),
detail_id integer,
primary key (e_id)
) engine=MyISAM
alter table Instructor
add constraint fk_detail
foreign key (detail_id)
references InstructorDetails (d_id)
这意味着根据这个ddl,已经创建了约束名为“fk\u detail”的外键,但是如果我打开mysql workbench并 checkout 创建表的ddl命令,那么下面的ddl就会显示出来
CREATE TABLE `instructor` (
`e_id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`detail_id` int DEFAULT NULL,
PRIMARY KEY (`e_id`),
KEY `fk_detail` (`detail_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
正如我们所看到的,创建了一个键“fk\u detail”,但它不是外键,因为缺少引用的表和列的详细信息,并且我看到了其他表的ddl,在这些情况下,在这些表中创建了外键约束,所有的详细信息都可用,而且detail\u id根本不像外键那样工作
那么如何解决这个问题,如何使用hibernate注解创建外键呢
暂无答案!
目前还没有任何答案,快来回答吧!