hibernate避免数据库中的重复

x7yiwoj4  于 2021-06-23  发布在  Mysql
关注(0)|答案(4)|浏览(370)

如何避免数据库中的重复。

'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.性别'

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;

添加person对象:
person=人();

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);
gojuced7

gojuced71#

如果我理解正确,国家和性别表是主数据,分别包含唯一的国家和性别。
在这种情况下,您不需要级联,在应用程序中获取所需的性别,将其设置为person和persist person。拆下 cascade = CascadeType.ALL 更新

Gender male = genderRepository.findByName("Male");
person.setGender(male);
...
personRepository.save(person)
o4tp2gmn

o4tp2gmn2#

我建议使用 unique index 以防止数据库表中出现重复。
在mysql中,可以通过以下语句完成:

CREATE UNIQUE INDEX ux_bi_gender_name
ON bi_gender(name);

它将保证在db级别上的唯一性。
关于hibernate注解:
据我所知,hibernate没有检查唯一性。
基于hibernatejavadoc的 @Column 这是表级别的uniqueconstraint注解的快捷方式,在uniquekey约束仅对应于单个列时非常有用。除了主键Map所包含的任何约束以及在表级别指定的约束之外,此约束也适用。
以及 @UniqueConstraint 指定在为主表或辅助表生成的ddl中包含唯一约束。
因此,如果您使用hibernate生成db模式以及出于文档的目的,这是很有帮助的。

avkwfej4

avkwfej43#

您必须将该列声明为唯一的: @Column(unique = true)

68bkxrlz

68bkxrlz4#

@Column(name = "name",unique = true, nullable=false) 
private String name;

在实体中使用此项可避免名称重复

相关问题