簡體   English   中英

hibernate避免在數據庫中重復

[英]hibernate avoid duplicates in database

如何避免數據庫中的重復。

'1', 'Male'
'2', 'Male'
'3', 'Female'

只保存

'1', 'Male'
'2', 'Female'

要么:

只保存

國家

    '1', 'UK'
    '2', 'Brazil'
    '3', 'China'

我的數據庫架構:

CREATE TABLE IF NOT EXISTS `bi_person` (
        `id_person` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `name` VARCHAR(50) NOT NULL,
        `last_name` VARCHAR(100) NOT NULL,
         `additional_info` VARCHAR(50) NOT NULL,
        `gender_id` VARCHAR (50) UNIQUE REFERENCES bi_gender
    ) COLLATE='utf8_bin';

- 表'bi.gender`


CREATE TABLE IF NOT EXISTS `bi_gender` (
        `id_gender` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `name`  VARCHAR(10) NOT NULL  
    ) COLLATE='utf8_bin';

- 表'bi.country`


CREATE TABLE IF NOT EXISTS `bi_country` (
        `id_country` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `name`  VARCHAR(10) NOT NULL 
    ) COLLATE='utf8_bin'; 

我的模型與許多人有關系 - 個人國家和一對多人 - >性別

模型:

public class Country {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_book")
    private Integer id;

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

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="bi_person_country", joinColumns=@JoinColumn(name="id_country"), inverseJoinColumns=@JoinColumn(name="id_person"))
    private Set<Person> persons;

型號性別:

@Table(name = "bi_gender")
@Entity
public class Gender {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

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

人物實體:

public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_person")
    private Integer id;

    @Column(name = "name")
    private String name;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "additional_info")
    private String additionalInfo;

    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "persons")
    private Set<Country> countries;

添加人物對象:

人物=人();

            Gender gender = new Gender();

            gender.setGenderName(pepPersons.get(a).getGender());

            gender = genderRepository.save(gender);

            Country country = new Country();

            country.setCountryName(pepPersons.get(a).getCountry());

            country = countryRepository.save(country);

            person.setName(pepPersons.get(a).getFirstName());
            person.setLastName(pepPersons.get(a).getLastName());
            person.setAdditionalInfo(pepPersons.get(0).getFunction());
            person.setGender(gender);

            Set<Country> countries = new HashSet();
            countries.add(country);
            person.setCountries(countries);

            personRepository.save(person);

您必須將該列聲明為唯一: @Column(unique = true)

我建議使用unique index來防止數據庫表中的重復。

在MySQL中,可以使用語句完成:

CREATE UNIQUE INDEX ux_bi_gender_name
ON bi_gender(name);

它將保證DB級別的唯一性。

關於Hibernate注釋:

據我所知,Hibernate不會檢查唯一性。

基於Hibernate JavaDoc for @Column

表級別的UniqueConstraint批注的快捷方式,對於唯一鍵約束僅對應於單個列時非常有用。 除了主鍵映射和表級指定的約束所引起的任何約束之外,此約束也適用。

@UniqueConstraint

指定將唯一約束包含在主表或輔助表的生成DDL中。

因此,如果您使用Hibernate生成DB Schema以及用於文檔目的,這將非常有用。

如果我理解正確,國家和性別表是主數據,分別包含唯一的國家和性別。

在這種情況下你不需要級聯,在應用程序中獲取所需的性別設置它並堅持人。 刪除cascade = CascadeType.ALL

更新

Gender male = genderRepository.findByName("Male");
person.setGender(male);
...
personRepository.save(person)
@Column(name = "name",unique = true, nullable=false) 
private String name;

在實體中使用它來避免重復的名稱

暫無
暫無

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

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