当前位置: 首页 > 知识库问答 >
问题:

为什么JpaRepository在保存实体时尝试为空FK密钥创建实体?

宗政欣可
2023-03-14

我的Person表中有字段country(FK,可以为空)。当我试图用空的国家/地区值保存Person时,我将收到一条错误消息500和消息

2020-01-30 15:16:37.277警告10524---[nio-8098-exec-1]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2020-01-30 15:16:37.277错误10524---[nio-8098-exec-1]o.h.engine。jdbc。spi。SqlExceptionHelper:öзББСА:зггбббббббббббббббббббббббббббб107。2020-01-30 15:16:37.299错误10524---[nio-8098-exec-1]o.z.问题。Spring常见的AdviceTraits:内部服务器错误

组织。springframework。刀。DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null];嵌套的异常是org。冬眠例外ConstraintViolationException:无法执行语句

粗差交易:

错误:“代码”列中的null值打破了非null限制详细信息:错误字符串包含(42,null,null,null)。

Person.java

@Entity
@Table(name = "t_person")
@Data
public class Person {
    @Id
    @Column(name = "person_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String surname;
    private String name;
    private String patronymic;

    @Column(name = "surname_rus")
    private String surnameRus;

    @Column(name = "name_rus")
    private String nameRus;

    @Column(name = "surname_eng")
    private String surnameEng;

    @Column(name = "name_eng")
    private String nameEng;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    private Country country;

    private String settlement;
    private String occupation;

    @ManyToMany
    @JoinTable(
            name = "person_link",
            joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "link_id", referencedColumnName = "link_id"))
    private List<UrlLink> linkList;

    @ManyToMany
    @JoinTable(
            name = "org_actor",
            joinColumns = @JoinColumn(name = "actor_id", referencedColumnName = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "org_id", referencedColumnName = "org_id"))
    private List<Org> orgList;

    private String description;

    @ManyToMany
    @JoinTable(
            name = "person_hashtag",
            joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id"),
            inverseJoinColumns = @JoinColumn(name = "hashtag_id", referencedColumnName = "hashtag_id"))
    private List<HashTag> hashtagList;


************
Country.java

@Entity
@Table(name="t_country")
@Data

public class Country {
    @Id
    @Column(name = "country_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Integer id;
    private String code;
    private String name;
}

create table t_country
(
    country_id serial  not null
        constraint t_country_pkey
            primary key,
    code       char(3) not null
        constraint unique_constr_code
            unique,
    name       text
        constraint unique_constr_name
            unique,
    miscellany text,
    constraint constr_name
        unique (code, name)
);

如何用空的国家保存个人实体?

共有1个答案

蓟捷
2023-03-14

在您的国家/地区数据库表定义中,字段代码定义为

code
   char(3) not null
    constraint unique_constr_code
        unique,

表示在db级别上存在非空约束。

这就是为什么你不能用一个空旷的国家来拯救一个人。

因此,即使java代码中没有NOTNULL约束,db也会拒绝该值。也许您在删除java代码中的NOTNULL约束后忘记了迁移db?

 类似资料:
  • 我有这样的Jpa存储库:

  • 我有以下两个实体类由Spring Data管理(实际上是幕后的JPA),出于某些原因,每当我试图将一个新的参与方保存到数据库中时,它都会添加一个新的重复组织者(即表中具有新id的重复条目)。 组织者类 派对课堂 保存方法 假设目前所有参与方只能由Organizer表中已列出的组织者创建,则Save方法中for循环中的行将尝试查找指定的组织者,并将参与方的引用设置为此检索到的组织者。 问题是,这实际

  • 我正在使用Spring、JPA和Hibernate。这是一个玩具示例,我正在使用它来调试一个更大的与JPA相关的问题。但是,这个试图持久化一个非常基本的实体的简单示例似乎创建了分离的对象。据我所知,在对象上调用应该将实体设置为由持久性上下文管理。但是,它不是,而且对此也不起作用。输出如下:: 为简洁起见省略了进口。 :: ::

  • 我试图创建一个简单的网站,其中托管主题和评论。我已经从主题开始,并为它们创建了存储库: 我已经在servlet上下文中定义了存储库的路径。xml: 现在,我想在我的存储库中包含注释,但以下代码不起作用: 我的项目甚至都没建好。你能给我一个建议吗,如何为多个实体创建存储库(主题类和注释类是用@Entity声明的)? 我面对的是: TopicRepository类图标上有HDD图片 org.sprin

  • 您需要创建一个通用的JpaRepository,以便处理系统进行的所有事务。在这里遵循这个示例。 它与实现有点不同,因为我的目标不是执行搜索,而是操作save方法。 unsatisfiedDependencyException:创建名为“sistema menuservice”的bean时出错:通过字段“sistema menurepository”表示未满足的依赖关系;嵌套异常是org.spri