如何避免数据库中的重复。
'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);
4条答案
按热度按时间gojuced71#
如果我理解正确,国家和性别表是主数据,分别包含唯一的国家和性别。
在这种情况下,您不需要级联,在应用程序中获取所需的性别,将其设置为person和persist person。拆下
cascade = CascadeType.ALL
更新o4tp2gmn2#
我建议使用
unique index
以防止数据库表中出现重复。在mysql中,可以通过以下语句完成:
它将保证在db级别上的唯一性。
关于hibernate注解:
据我所知,hibernate没有检查唯一性。
基于hibernatejavadoc的
@Column
这是表级别的uniqueconstraint注解的快捷方式,在uniquekey约束仅对应于单个列时非常有用。除了主键Map所包含的任何约束以及在表级别指定的约束之外,此约束也适用。以及
@UniqueConstraint
指定在为主表或辅助表生成的ddl中包含唯一约束。因此,如果您使用hibernate生成db模式以及出于文档的目的,这是很有帮助的。
avkwfej43#
您必须将该列声明为唯一的:
@Column(unique = true)
68bkxrlz4#
在实体中使用此项可避免名称重复