hibenate 가 끌 어 낸 몇 가지 갈등 사건 분석
우선: 데이터베이스 필드 를 자체 성장 으로 설정 할 때, 예 를 들 어 현재 데이터베이스 에 있 는 id 가 1 이면 계속 삽입 하 겠 습 니 다. 실패 하면 다음 에 다시 삽입 하 겠 습 니 다. 결 과 는 3 입 니 다.
나 는 데이터베이스 의 모든 데 이 터 를 삭제 하고 다시 강하 게 삽입 한 결 과 는 4 이다.
이 데이터 베 이 스 는 어떻게 된 것 입 니까? 왜 삽입 에 실 패 했 습 니까? 다음 에 다시 삽입 하면 그 는 3 입 니 다. 모든 데 이 터 를 삭제 하고 다시 삽입 하면 4 입 니까?
예전 에 계속 썼 는데 생각 도 못 했 어 요.
다음:
다 중 관계, 한 쪽 은 유지 보수 세그먼트 입 니 다. 이것 은 논리 적 으로 하기 어렵 고 한 쪽 은 다 중 시 계 를 유지 하고 있 습 니 다.
삭제 하려 면 그 표를 통 해 데 이 터 를 넣 어야 합 니 다. 그렇지 않 으 면 잘못 보고 할 수 있 습 니 다.이것 은 모두 가 어떻게 해 결 했 는 지, 이렇게 아 쉬 운 대로 한다.
이 안의 구체 적 인 논 리 는 어떻게 하나, 왜 이렇게 설계 되 었 습 니까?
그리고 두 쌍 의 다 중 표 는 실체 간 에 작업 을 삭제 할 때 다음 과 같은 문제 가 존재 합 니 다.
두 실 체 는 아래 와 같다.
package com.jpa.bean;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Brand {
private String name;
private Set<Person> persons=new HashSet<Person>();
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(cascade={CascadeType.PERSIST},mappedBy="brands")
public Set<Person> getPersons() {
return persons;
}
public void setPersons(Set<Person> persons) {
this.persons = persons;
}
}
package com.jpa.bean;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Person {
private int id;
private Set<Brand> brands=new HashSet<Brand>();
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToMany(cascade={CascadeType.PERSIST})
@JoinTable(inverseJoinColumns=@JoinColumn(name="person_id"),
joinColumns=@JoinColumn(name="brand_id"))
public Set<Brand> getBrands() {
return brands;
}
public void setBrands(Set<Brand> brands) {
this.brands = brands;
}
}
/**
em.getTransaction().begin();
Brand b=em.getReference(Brand.class, "ANTA");
Person p=em.getReference(Person.class, 7);
p.getBrands().remove(b);
em.remove(p);
em.getTransaction().commit();
상기 조작 부 에 문제 가 있 을 수 있 습 니 다. Brand 가 조회 되 지 않 았 을 때 자신의 new 입 니 다.
Brand b=new Brand();
b.setName("ANTA");
그럼 잘못 보고 하 는 게 왜?
나의 분석 은 Person p = em. getReference (Person. class, 7) 이다.받 은 대 리 는 p. getBrands (). reove (b) 를 직접 통과 합 니 다.그들의 관 계 를 접 할 수 는 없다.
Person p = em. find (Person. class, 7) 를 테스트 합 니 다.
문 제 를 해결 하 다
모두 토론 하 러 오신 것 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.