如何避免数据库中的重复项。
'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);
答案 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;
在实体中使用此名称以避免重复的名称