Hibernate:@OneToOne不在数据库中产生“一对一”关系

Dan*_*iga 4 java sql hibernate jpa

我对 JPA 和 Hibernate 比较陌生,我正在尝试了解 @OneTo One 注释的工作原理,假设我有一个具有以下关系的实体“任务”:

 @OneToOne
    @JoinColumn(name = "manager_id")
    private Manager manager;
Run Code Online (Sandbox Code Playgroud)

还有实体“Manager”:

@Entity
@Table(name = "manager")
public class Manager {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;
 private String name;

 public Manager() {
 }
Run Code Online (Sandbox Code Playgroud)

当我运行测试文件并将“hibernate.hbm2ddl.auto”设置为“更新”时,我在数据库中得到了多对一关系(如您所见,没有任何类型的唯一约束使其成为可能)一对一的关系):

CREATE TABLE IF NOT EXISTS `timesheet`.`task` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `completed` BIT(1) NOT NULL,
  `description` VARCHAR(255) NULL DEFAULT NULL,
  `manager_id` BIGINT(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `FK3635851B178516` (`manager_id` ASC),
  CONSTRAINT `FK3635851B178516`
    FOREIGN KEY (`manager_id`)
    REFERENCES `timesheet`.`manager` (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
Run Code Online (Sandbox Code Playgroud)

为了确定这一点,我尝试添加两条具有相同经理 ID 的记录,并且确实添加了,我还尝试设置像“ @Table(name = "Task",uniqueConstraints = @UniqueConstraint(columnNames =...”这样的唯一约束,但没有运气。@OneToOne那么为什么会发生这种情况?如果没有应用程序逻辑来验证这一点,那么使用注释到底有什么优点呢?

另外,Hibernate 是否有可能无法正确生成 DDL?(我知道通过休眠生成模式仅用于测试)

xti*_*ian 6

在单向关系中,如果将其标记为“可选= false”,您将获得预期的唯一约束。当然,如果您将连接列显式设置为唯一,您也会得到它。

所以要么

@OneToOne(optional=false)
    @JoinColumn(name = "manager_id")
    private Manager manager;
Run Code Online (Sandbox Code Playgroud)

或者

@OneToOne
    @JoinColumn(name = "manager_id", unique=true)
    private Manager manager;
Run Code Online (Sandbox Code Playgroud)

那么为什么需要将其标记为非可选呢?我的猜测是,当值是可选的时,该列可以包含许多空值,但在许多数据库中,当存在唯一约束时,这是无法完成的。不过,您可以在 MySQL 中执行此操作,因此在这种情况下,Hibernate 生成器可能没有考虑数据库(一个错误?)。请参阅此处有关 MySQL 处理 null 的讨论。