繁体   English   中英

为什么 Hibernate 允许我在外键约束上插入空值?

[英]Why does Hibernate allow me to insert a null value on a foreign key constraint?

我正在试验 jpa 和休眠关系。 我正在使用一个名为 users 的表和一个名为 emails 的表。 一个用户可以有许多电子邮件。

当我运行 Spring boot 应用程序和以下代码时,我在 h2 数据库中得到了一封电子邮件记录。 该记录的email_address 为testAddress,该记录的user_username 列为空。 user_username 列在 emails 表中被列为外键。 我的问题是,当数据库中没有对应的用户时,为什么 emailRepository.save(email1) 成功?

@Entity
@Table(name = "emails")
public class Email {

    @Id
    private String emailAddress;

    @ManyToOne
    private User user;

    ...

}

@Entity
@Table(name = "users")
public class User {

    @Id
    private String username;

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
    private Set<Email> emails;

    ...

}

public interface UserRepository extends JpaRepository<User, String> {

}

public interface EmailRepository extends JpaRepository<Email, String> {

}

@Component
public class UserRepositoryCommandLineRunner implements CommandLineRunner {

    @Autowired
    private EmailRepository emailRepository;

    public void run(String... args) throws Exception {
        Email email1 = new Email();
        email1.setEmailAddress("testAddress");
        emailRepository.save(email1);
    }

}

看一下JoinColumn注解的文档: https ://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html#nullable ()

它提到:

如果 JoinColumn 注释本身是默认值,则假定为单个连接列并应用默认值。

由于您没有在ManyToOne映射中指定JoinColumn ,那么 Hibernate 将假定默认JoinColumn 如果您查看JoinColumn.nullable属性,它默认为 true。 因此,当 Hibernate 生成您的架构时,外键列默认为 NULLABLE。

您可能需要在@ManyToOne映射之上显式添加@JoinColumn注释并将其nullable属性设置为 false。

@ManyToOne
@JoinColumn(nullable=false)
private User user;

这样,当您尝试在没有用户的情况下插入电子邮件时,它会抛出错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM