hibenate 가 끌 어 낸 몇 가지 갈등 사건 분석

저희 프로젝트 는 ibatis 를 사 용 했 습 니 다. 오 랜 만 에 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) 를 테스트 합 니 다.
문 제 를 해결 하 다
모두 토론 하 러 오신 것 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기