문제

주석이 실제로 어떻게 작동하는지 잘 모르겠습니다. 동일한 클래스에서 JAXB 및 JPA (eclipselink 포함)를 사용하고 있습니다. 즉, 다음과 같은 클래스 정의를 얻습니다.

@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...
}

이제 이상한 오류가 발생합니다 (예 : "com.econemon.suite.common.models.channel@115c974는 알려진 엔티티 유형이 아닙니다." 주석이 서로를 방해 할 것인지 궁금하십니까?

도움이 되었습니까?

해결책

주석은 다른 주석을 방해 할 수 없습니다. 다른 패키지에서 나왔고 이름이 다른 경우가 아닙니다. 각 프레임 워크 (JAXB 및 Hibernate)에는 자신의 주석이 있습니다. 각 프레임 워크는 자신의 주석만이 자신의 주석만 내성적입니다. 나는 이것이 여기서 문제가 아니라고 확신합니다.

엔터티를 확인하십시오.

a) 인수 생성자 (기본 생성자는 괜찮지 만, 인수가있는 생성자 만있는 경우 JPA에 대한 인수 생성자를 제공해야합니다. 이것은 보호되거나 패키지가 보일 수 있습니다 ....)

b) 필드 또는 getter의 @id 주석 (우리는 항상 필드 기반 주석을 사용합니다. 그렇지 않으면 JPA getter 주석을 유형의 필드 주석과 혼합하지 마십시오!)

c) 유형이 지속성 단위에 있고 지속성 단위가 사용됩니다.

d) 유형에는 @entity 주석이 있습니다

상속을 사용하는 경우 (이름이 지명됨) JPA에 더 많은 정보를 제공해야합니다. 처음에는 extends의 이름을 제거하려고 노력하십시오. 그리고 상속 변형을 설명하는 좋은 JPA 튜토리얼을 보는 것보다.

다른 팁

아니, 그들은하지 않습니다.

나는 다른 모든 주석을 제거하고 상속을 잘라 내고 매우 간단한 수업으로 끝났습니다. 문제가 남아있었습니다.

내 게시물에서 언급되지 않은 것은 (관련이 없다고 생각했기 때문에) OSGI 컨테이너 (Felix) 내부에서 이것을 실행한다는 것입니다. 이제 그러한 컨테이너는 서로 다른 "번들"을 서로 방패하므로 구체적으로 "내보내기"패키지까지 서로의 클래스를 볼 수 없습니다.

주석이 달린 클래스는 내 지속성과 다른 번들에 앉아 있었고 XML과 다른 번들에서 주석이 달린 클래스를 가져 와서 다른 곳에서 지속성을 수행 할 수 있다고 가정했습니다. 나는 왜 그런지 이해하지 못했지만 나는 할 수 없다는 것이 밝혀졌다.

따라서 OSGI 번들과 함께 JPA를 사용하는 경우 다음을 확인해야합니다.

  • 주석이 달린 클래스와 Persistence.xml은 동일한 번들에 함께 있습니다.
  • 이 번들은 주석이 달린 클래스가 포함 된 패키지를 내 보냅니다
  • 영구 단위는 번들의 매니페스트 파일에 나열되어 있습니다.

그런 다음 다른 번들에서 실제 지속성 작업 (EntityManager.persist와 같은)을 수행 할 수 있습니다.

부수적으로, 나는 얻었다 마찬가지로 이상한 오류 번들을 가로 질러 JAXB 주석을 사용하려고 할 때. JaxbContext 및 / 또는 객체 기능은 주석이 달린 클래스를 포함하는 동일한 번들로 인스턴스화 해야하는 것 같습니다. 나는 이것을 실제로 못 박았을 수 없었지만 같은 번들에 물건을 넣는 것이 도움이되었습니다.

OSGI, 클래스 로딩 및 주석에 대한 더 깊은 이해를 가진 사람이 여기서 일어날 수있는 일에 대해 언급 할 수 있다면 좋을 것입니다.

업데이트: 적절한 주석 패키지 내보내기 / 가져 오면 다른 번들에 지속성을 가질 수 있습니다. XML 및 주석이 달린 클래스를 참조하십시오. 여기. 그래도 테스트하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top