2012-01-29 5 views
2

에 ManyToMany 관계는 전 클래스가 있습니다. 이를 위해 ORM 다음과 같이 MappedSuperclass

나는 AnimalClass에서 사용

:

Animal_Tag [FishClass_id, MammalClass_id, Tag_id]. 

내가 같은 열거의 어떤 종류를 선호하는 것 :

@JoinTable(name="Animal_Tag") 
@JoinColumn(name="animal_id", referencedColumnName="id", nullable=false) 
@OneToMany(cascade=CascadeType.ALL) 
@Getter 
protected Set<Tag> tags = new HashSet<Tag>(); 

내 문제가 최대 절전 모드로 백만 테이블을 작성한다는 것입니다

Animal_Tag [Animal_id, AnimalTypeEnumeration[ Fish | Mammal ], Tag_id]. 

감사!

답변

2

매핑 된 수퍼 클래스로는 그렇게 할 수 없습니다.

매핑 된 수퍼 클래스의 특징은 지속적 유형을 정의하지 않는다는 점입니다. 그것은 영구적 인 타입을위한 일종의 템플릿을 정의합니다. @Entity이라는 주석이 달린 서브 클래스를 정의 할 때마다 템플리트의 인스턴스를 작성하지만 데이터 모델에서는 이들 유형 간에는 관계가 없습니다. 맵핑 된 수퍼 클래스의 사용은 주어진 필드 세트를 새로운 엔티티 클래스에 복사하여 붙여 넣기하는 지름길입니다.

따라서 데이터 모델과 관련하여 동물과 같은 유형이 없으므로 가능한 animal_id가 없습니다. 물고기와 포유 동물 만 데이터베이스에 존재합니다.

AnimalClass을 매핑 된 수퍼 클래스 대신 엔티티로 만들 수 있습니까? 클래스 당 상속 전략을 사용하는 경우에는 테이블을 만들 필요가 없습니다. 그러나 그것은 동물을 하나의 유형으로 만들 것입니다. 즉, ORM이 animal_id를 사용할 수 있음을 의미합니다.

+0

스키마가 사실 훨씬 더 복잡하기 때문에 수퍼 클래스를 @Entity로 사용할 수 없습니다 (다른 상속 된 클래스를 결합하는 4 개의 상속 된 클래스). 문제는 내가 여기서 달성하고자하는 것이 정확히 클래스의 다른 부분으로 달성하려고하는 것과 반대입니다. Animal_Tag를 갖고 싶습니다. 그러나 다른 변수에서 inst와 정확히 구분해야합니다. Fish_Photos 및 Mammal_Photos. –

+0

기본 클래스가 아닌 물고기 및 포유 동물 클래스에서 변수를 선언하여 별도의 물고기 및 포유류 사진을 가질 수 있습니다. 엔티티의 자식 인 매핑 된 수퍼 클래스를 가질 수 있습니까? Animal 엔티티를 가질 수 있고, 그것을 확장 한 Vertebrate 매핑 된 수퍼 클래스를 가질 수 있습니다. 그런 다음이를 확장하는 Fish 및 Animal을 확장 할 수 있습니다. 이것은 조금 고안된 것이지만 문제를 해결할 수 있습니다. –

1

AnimalClass에 대한 상속은 "식별자가있는 하위 클래스 당 테이블"을 사용할 수 있습니까? 최대 절전 모드 인 경우 hirecaly가 발생합니다.

AnimalClass [Id, AnimalTypeEnumeration (discriminator), Name] 
| 
+-- FishClass [FishSpecific] 
+-- MammalClass [MammalSpecific] 
Animal_Tag [Animal_id, Tag_id] 
+0

문제점은 제가 수퍼 클래스를 @Entity로 사용할 수 없다는 것입니다. Tom Anderson에 대한 제 코멘트를 읽어주십시오. –

2

다른 테이블의 값에 따라 다른 테이블을 가리킬 수있는 외래 키가 테이블 구조에 있습니다. 나는 어떤 DB도 그렇게 생각하지 않는다.

ORM을 사용한 다형성은 항상 까다 롭습니다. 가능한 한 최선의 일은 할 수 있으면 그냥 피하는 것입니다. 그렇지 않으면 동물에 @Inheritance(strategy=InheritanceType.JOINED)을 사용할 수 있습니까? 이것은 다음과 같은 테이블 구조가됩니다 :

TABLE Animal 
- id (primary key) 

TABLE Fish 
- id (foreign key -> Animal) 
- fins 
- scales 

TABLE Mammal 
- id (foreign key -> Animal) 
- mammaries 
+0

그건 그렇고, JPA 주석에 대해 얘기하고있었습니다. 단지 당신이 Hibernate 주석을 사용하고있는 것으로 나타났습니다.나는 Hibernate와 동등한 것이 무엇인지 모른다. –

+0

JPA 주석은 Hibernate와 동일합니다. 이전 답에 대해 작성한 주석을 읽으십시오. –