2012-06-15 2 views
2

JPA를 사용하여 다음 관계를 구현하려면 어떻게해야합니까?many-to-many 관계 모델링하는 방법

table person (
    id int, 
    name text 
) 

table person_home (
    person_id int, 
    home_id int, 
    type char(1)  -- 'p' = primary, 's' = secondary 
) 

table home (
    id int, 
    address text 
) 

사람은 많은 집을 가질 수 있으며 집에는 많은 사람이 거주 할 수 있습니다 (예 : ManyToMany 관계). 또한 집은 한 사람에게는 주 거주지가 될 수 있지만 동시에 다른 사람에게는 보조 거주지가 될 수 있습니다.

데이터베이스 스키마가 명확하더라도이 관계를 모델링하는 방법을 모르겠습니다.

필자는 person_primary_home과 person_secondary_home으로 매핑 테이블 person_home을 분할하려고 생각했지만 가능한 경우 스키마를 유지하는 것이 좋습니다.

답변

1

이 질문은 꽤 많이 물어 여기에 대한 답변 :
How to create a composite primary key which contains a @ManyToOne attribute as an @EmbeddedId in JPA?

당신은 네 개의 클래스가 필요합니다

  1. Person.java
  2. Home.java을
  3. PersonHome.java
  4. 을 PersonHomePk.java

PersonHome.java와 일대 다 관계로 작성하는 Person.java 및 Home.java 파일. 기본 키를 식별 할 수있는 @Id 필드가 있습니다. 각각은 PersonHome 엔티티의 각각의 필드에 맵핑 된 적어도 하나의 mappedBy 속성으로 정의 된 @OneToMany 관계를 가질 것이다. 즉,이 Person.java에 당신은 대신 @Id 열의, PersonHome.java는 기본 키 (즉이다 PersonHomePk 인스턴스 선언을 식별하는 @EmbeddedId 필드가됩니다

@OneToMany(cascade = CascadeType.ALL, mappedBy = "Person") 
private Collection<PersonHome> personHome; 

같은 것을 가질 수 당신 Join 테이블 PersonHome의 기본 키를 나타내는 클래스의 선언에 @EmbeddedId 주석을 추가합니다. 다른 모든 필드는 일반 열로 선언됩니다. PersonHome.java는 사람과 집 각각에 두 개의 ManyToOne 관계를 선언합니다. 이것들은 @JoinColumn 어노테이션을 사용합니다 (insertable = false 및 updatable = false 속성을 가지고 있는지 확인하십시오). 데이터 유형은 Person 및 Home 클래스가됩니다. 즉

@EmbeddedId 
protected PersonHomePk personHomePk; 
@Column (name = "type") 
private String type; 
@JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private Person person; 

'홈'선언에도 동일하게 적용됩니다.

왜 "문자"로만 문자를 사용하고 있습니까? 일단 varchar를 사용하면 사람들이 사라진 후에도이를 유지 관리하는 사람들이 주위에 없을 때 코드와 데이터베이스를 더 잘 이해할 수 있습니다. 'detached'는 'd'를 더 쉽게 이해합니다.

0

person_home 테이블의 관계 외에 메타 데이터를 사용하려면 모든 데이터에 액세스 할 수 있도록 두 개의 일대 다 관계가있는 세 개의 개체를 사용해야합니다.

primary_home_id 및 secondary_home_id를 사용하여 person 테이블에서 home 테이블로 두 개의 many-to-one 관계를 설정하면이 필요성을 없앨 수 있습니다. 여기에 요구 사항이 누락되어 있고 한 명 이상이 가질 수없는 경우가 아니면 1 차 또는 2 차 가정.

+0

예. 한 개인이 각 유형의 집을 두 개 이상 가질 수 있습니다. 그래서 대답은 매핑 테이블을 클래스로 모델링해야한다는 것입니다. –

+0

'type' 칼럼을 원한다면, 그렇다고 나는 믿는다. – ametren

+0

관계에 대한 메타 데이터를 갖는 것이 매우 유용하기 때문에이 정보를 상당히 많이 조사했습니다. 저는 실제로 그것을 "다 대다"라고 부르는 방법을 찾았지만, 어쨌든 관계를 나타내는 객체를 가져야한다고 생각합니다. 두 개의 일대 다 관계라고 생각하는 것이 더 쉽습니다. – ametren

관련 문제