休眠避免数据库中重复

时间:2018-08-13 08:31:54

标签: java mysql spring hibernate

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

'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;

添加人物对象:

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我建议使用unique index来防止DB表中出现重复项。

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

CREATE UNIQUE INDEX ux_bi_gender_name
ON bi_gender(name);

这将保证数据库级别的唯一性。

关于Hibernate注释:

据我所知,Hibernate不会对唯一性进行任何检查。

基于@Column的Hibernate JavaDoc

  

是表级别的UniqueConstraint批注的快捷方式,当唯一键约束仅对应于单个列时,此功能很有用。除了主键映射所带来的任何约束以及在表级别指定的约束之外,该约束也适用。

@UniqueConstraint

  

指定为主表或辅助表在生成的DDL中包含唯一约束。

因此,如果您要使用Hibernate生成数据库架构以及出于文档目的,这将很有帮助。

答案 2 :(得分:1)

如果我对您的理解正确,则国家和性别表是主数据,分别包含唯一的国家和性别。

在这种情况下,您不需要级联,请在应用程序中获取所需的性别并将其设置在人员上并保留人员。删除cascade = CascadeType.ALL

更新

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

答案 3 :(得分:0)

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

在实体中使用此名称以避免重复的名称