2012-01-07 2 views
0

JPA에서 다소 복잡한 매핑을 구현하려고합니다. 이 예제와 비슷한 것이 필요합니다. 여러 종류의 작가와 여러 종류의 글쓰기가 있습니다. 각 글에는 지속 가능한 작성자 필드가 있어야합니다. 저자의 동적 유형은 중요하지 않습니다. 이것이 정적 추상 유형으로 설정 한 이유입니다. 그러나 Authro는 소설과 시가 각각 작성한 두 개의 목록을 가지고 있어야합니다.JPA 다형 관계, 정적 및 동적 입력

MappedSuperClass를 지속 가능한 필드의 대상으로 사용할 수 없다는 오류가 나타납니다. 누구든지 내가 성취하려는 것을 성취하는 방법을 알고 있습니까?

필자도이 양방향 관계를 소유하고 싶습니다. 그래서에 의해지도는 소설이나시 측면에 있어야합니다. 그러나 매핑 된 것만이 OneToMany면에만있을 수 있습니다 ... 한 가지가 많은 것을 소유하고있는 이상한 경우처럼 보이지 않습니다 ... 왜이 일을 할 수 없는지 ...

고맙습니다. 많은 도움이

@MappedSuperclass 
@Access(AccessType.PROPERTY) 
public abstract class AbstractWriter implements Serializable{ 

    private Long id; 
    private String name; 
    private String email; 

    private ArrayList<Novel> novels; 
    private ArrayList<Poem> poems; 


    @OneToMany(mappedBy="author") 
    public ArrayList<Novel> getNovels() { 
     return novels; 
    } 
    public void setNovels(ArrayList<Novel> novels) { 
     this.novels = novels; 
    } 

    @OneToMany(mappedBy="author") 
    public ArrayList<Poems> getPoems() { 
     return poems; 
    } 
    public void setPoems(ArrayList<Poem> poems) { 
     this.poems = poems; 
    } 

    @Column(nullable=false) 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Id @GeneratedValue(strategy= GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 


@Entity 
public class ProfessionalWriter extends AbstractWriter { 
} 

@Entity 
public class StudentWriter extends AbstractWriter { 
} 


@MappedSuperclass 
public abstract class AbstractWriting implements Serializable{ 

    private Long id; 

    private String title; 
    private AbstractWriter author; 
    private byte[] words; 




    @ManyToOne 
    public AbstractWriter getAuthor() { 
     return author; 
    } 
    public void setAuthor(AbstractWriter author) { 
     this.author = author; 
    } 

    @Id @GeneratedValue(strategy= GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 

    @Lob 
    public byte[] getWords() { 
     return words; 
    } 
    public void setWords(byte[] words) { 
     this.words = words; 
    } 

    @Column(nullable=false) 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
} 

@Entity 
public class Novel extends AbstractWriting { 
} 

@Entity 
public class Poem extends AbstractWriting { 
} 

답변

1

추상 클래스는 @MappedSuperclass가 아닌 @Entity로 주석되어야합니다. 물론 inheritance 전략을 선택해야합니다.

소유권 측면 : 연관성 소유는 의미 론적 의미가 없습니다. JPA가 연관성이 있는지를 알기 위해 JPA에서 사용하는 것이 협회의 측면입니다. JPA는 실제로 많은 측면에서 연관 매핑을 소유하고 있으며, 외래 키가 많은면과 관련된 테이블에 있으므로 논리적 인 관계입니다. 여러분에게 시가 저자에게 추가 될 때,이시는 저자를 참고해야한다는 것을 의미합니다. 왜냐하면 그것이 협회를 끈질 기게 만들 것이기 ​​때문입니다.

또한 ArrayList가 아니라 목록을 사용해야합니다. EclipseLink는 자체 목록 구현을 사용하여 지연로드, 계단식 등을 지원합니다. 그리고 구현이 아니라 인터페이스로 프로그래밍하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. 나는이 변화를 만들 것이다. 구현보다는 인터페이스로 프로그래밍하는 방법을 제안 할 수 있습니까? 나는 당신이 의미하는 바를 아주 잘 이해하고 있다고 생각하지 않습니다. – b3bop

+0

구체적 유형 (예 : ArrayList, HashMap)보다는 인터페이스 유형 (예 : List, Map)을 항상 사용하는 것이 좋습니다. 이 방법으로 마음이 바뀌어 ArrayList가 아닌 LinkedList (또는 TreeMap)를 사용하려는 경우 목록의 인스턴스화와 같은 코드를 한 곳에서 변경하면됩니다. 나머지 코드는 ArrayList인지 LinkedList인지 상관하지 않아야합니다. 그것이 알아야 할 것은리스트라는 것입니다. JPA에서는 이것이 매우 중요합니다. 이는 EclipseLink가 List를 구현하는 EclipseLinkLazyList와 같이 사용자의 목록을 효과적으로 대체하기 때문입니다. –

+0

매우 통찰력있는. 매우 감사합니다. – b3bop