簡體   English   中英

為什么休眠會產生不必要的約束?

[英]Why hibernate generates unnecessary constraint?

我在 Hibernate 中由雙向關系生成的 SQL 有一個奇怪的問題。 這是代碼。

首先是@OneToMany方面:

@Entity
@Table(name = "employers")
public class Employer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "eid")
    private Long employerId;
    
    private String name;
    
    @OneToMany(mappedBy = "titleId")
    private Set<Title> titles = new TreeSet<>(); 
    
    // Getters/setters...
}

@ManyToOne方面:

@Entity
@Table(name = "titles")
public class Title {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "tid")
    private long titleId;
    
    /**
     * Not sure if I need a bi-directional relation here.
     */
    @ManyToOne
    @JoinColumn(name = "employerId")
    private Employer employer;

    // Getters/setters...
}

我對 springboot 和 hibernate 相當陌生,所以這是我嘗試的第一件事,它實際上可以運行。 根據我參考的教程和文檔,在我的案例中生成的 SQL 是錯誤的。

這是生成的 SQL ( Postgres9Dialect )

CREATE TABLE public.items
(
    item_id bigint NOT NULL DEFAULT nextval('items_item_id_seq'::regclass),
    text character varying(255) COLLATE pg_catalog."default",
    title_tid bigint,
    CONSTRAINT items_pkey PRIMARY KEY (item_id),
    CONSTRAINT fkkwhqrl3vscoqcacws6kgsdlx5 FOREIGN KEY (item_id)
        REFERENCES public.titles (tid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fkluhgxmnakeuroph186b2k05eq FOREIGN KEY (title_tid)
        REFERENCES public.titles (tid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

問題是這個約束:

CONSTRAINT fkkwhqrl3vscoqcacws6kgsdlx5 FOREIGN KEY (item_id)
REFERENCES public.titles (tid) MATCH SIMPLE
   ON UPDATE NO ACTION
   ON DELETE NO ACTION,

如果頭銜 id ( tid ) 超過雇主 id 的最大數量(雇主表中的 eid),它會導致不允許創建其他頭銜。 生成的雇主表是正確的。

如果我手動刪除此約束,則它會按預期工作。

為什么要創建這個錯誤的約束? 我錯過了什么?

(順便說一句,標題是指特定雇主的標題,而不是書名,所以我不想將雇主和作者教程結合起來)

您應該以這種方式更正您的映射:

@Entity
@Table(name = "employers")
public class Employer {
    @OneToMany(mappedBy = "employer")
    private Set<Title> titles = new TreeSet<>(); 
    // ...
}

@Entity
@Table(name = "titles")
public class Title {

    @ManyToOne
    @JoinColumn(name = "employerId")
    private Employer employer;
    // ...
}

mappedBy應該保存關聯另一側的字段名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM