2009-06-23 3 views
1

어노테이션이 실제로 어떻게 작동하는지 잘 모르겠습니다. 동일한 클래스에서 JAXB와 JPA (eclipselink 포함)를 사용하고 있습니다. 이자형. 나는이 같은 클래스 정의를 얻을 :여러 프로세서에 대한 주석을 Java 클래스에 넣을 수 있습니까?

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Channel") 
@Entity 
public class Channel extends NamedEntity { 
    @XmlAttribute 
    @XmlSchemaType(name = "anyURI") 
    @Column(name="url") 
    protected String url; 

    @XmlAttribute 
    @Column 
    protected String coDirection; 
    // etc... 
} 

지금은 (예를 들어 이상한 오류를 받고 있어요 보통 것을 의미한다 "[email protected]는 기존의 엔티티 타입이다" 클래스가 내 persistence.xml에 없습니다.) 주석이 서로 간섭하는지 궁금합니다.

답변

3

주석은 다른 주석, esp를 간섭 할 수 없습니다. 다른 패키지에서 왔고 다른 이름을 가진 경우가 아닙니다. 각 프레임 워크 (JAXB 및 Hibernate)에는 고유 한 주석이 있습니다. 각 프레임 워크는 주석 만 소유합니다. 나는 이것이 이것이 여기서 문제가 아니라고 확신한다.

이가 당신의 실체를 확인하십시오 :

A)에는 인수 생성자 (기본 생성자는 괜찮지 만, 당신이 인수 만 생성자가있는 경우, 당신은 JPA에 인수가없는 생성자를 제공해야합니다,이 보호 될 수 없다 또는 보이는 패키지 ....)

b)는 필드 또는 게터에 @Id 주석 (우리는 항상 다른 타입의 필드 주석과 JPA 게터 주석을 혼합하지, 필드 기반의 주석을 사용!)

C) 유형이 당신의 영속에 기기와 지속성 단위는 상속을 (NamedEntity을 확장), 더 JPA에게 당신이 어떤이를 매핑하는 방법에 더 많은 정보를 제공해야 사용하는 경우 유형은 @Entity 주석에게

있다)

D

을 사용한다. 먼저 NamedEntity extends 항목을 제거하십시오. 그리고 상속 변종을 설명하는 좋은 JPA 자습서를 살펴보십시오.

+0

+1 체크리스트는 일반적으로 매우 유용합니다. 그러나 게시하기 전에 이미 작업을 마쳤습니다. 마침내 나는 그것이 실제로 이해하지 못하는 클래스 로딩 문제가 될 것이라고 생각했지만 어쨌든 해결할 수있었습니다. 내 대답도 참조하십시오. –

0

아니요, 그렇지 않습니다.

나는 다른 모든 주석을 제거하고 상속을 없애고 매우 간단한 클래스를 만들었습니다. 문제가 남아 있습니다.

내 게시물에 언급되지 않은 것은 (필자는 관련이 없다고 생각했기 때문에) OSGi 컨테이너 (이 경우에는 Felix)에서 실행하고있었습니다. 이제는 이러한 컨테이너가 서로 다른 "묶음"을 보호하므로 패키지를 구체적으로 "내보낼"때까지 서로의 클래스를 볼 수 없습니다.

주석이 달린 클래스는 내 persistence.xml과 다른 번들에 있었고 다른 번들에서 주석이 달린 클래스를 가져 와서 다른 곳에서 지속성 초기화 작업을 수행 할 수 있다고 가정했습니다. 내가 왜 그 이유를 정말로 이해하지는 못했지만, 나는 할 수 없다.

  • 주석 클래스와의 persistence.xml이 번들은 수출
  • 같은 번들에 함께 있습니다 : 당신이 OSGi 번들과 함께 JPA를 사용하는 경우

    그래서, 당신은 있는지 확인해야합니다 주석 클래스

  • 지속성 장치 (들)을 포함하는 패키지는 번들의 매니페스트 파일에 나열되어

당신은 엔트를 호출처럼 (실제 지속성 작업을 수행 한 후 수 ityManager.persist)를 다른 번들로 만듭니다.

번들 전체에서 JAXB 주석을 사용하려고 할 때 보조 노트로 similarly weird errors을 얻었습니다. JAXBContext 및/또는 ObjectFactory는 주석이 달린 클래스를 포함하는 동일한 번들에서 인스턴스화되어야합니다. 나는 이것을 내려 놓을 수는 없었지만 같은 묶음에 물건을 두는 것이 도움이되었습니다.

OSGi, 클래스 로딩 및 주석에 대해 더 깊이 이해하고있는 누군가가 여기에서 일어날 수있는 일에 대해 의견을 말할 수 있다면 좋을 것입니다.

업데이트 : 적절한 주석 패키지를 내보내거나 가져 오면 다른 번들의 persistence.xml 및 주석이 적용된 클래스를 사용할 수 있습니다 (here 참조). 하지만, 테스트하지 않았습니다.

관련 문제