[英]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.