2015-11-07 46 views
1

我有以下星座: B1.xsd和B2.xsd都導入A.xsd。使用maven-hyperjaxb3-plugin我使用JPA批註爲B1.xsd和B2.xsd創建了Java類。所以A.xsd的類是在B1.xsd的項目中創建的,以及在B2.xsd的項目中創建的。 爲了在一個持久性單元中使用這兩組類,我通過jaxb外部綁定來設置每個實體上的數據庫模式,如Editing @java.persitence.Table in external jaxb-Binding中所示。通過外部jaxb-Binding編輯@ java.persitence.Entity的名稱參數

的問題,部署到wildfly後,wildfly拋出org.hibernate.DuplicateMappingException:重複導入:B1_ClassName指的是B1_ClassName和B2_ClassName(嘗試使用自動導入= \ 「假\」)「}}

所以我需要做的是通過JAXB編輯實體標註的名稱參數外部約束力,使

@XmlRootElement(name = "B1_Element1") 
@Immutable 
@Cacheable(true) 
@Entity(name = "B1_Element1") 
@Table(name = "B1_Element1") 
public class B1_Element1 
    implements Serializable, Equals, HashCode, ToString 
{ 
... 
} 

看起來像

@XmlRootElement(name = "B1_Element1") 
@Immutable 
@Cacheable(true) 
@Entity(name = "PACKAGE_NAME.B1_Element1") 
@Table(name = "B1_Element1") 
public class B1_Element1 
    implements Serializable, Equals, HashCode, ToString 
{ 
... 
} 

我的實際綁定,xjc.xjb看起來像這樣

<jaxb:globalBindings localScoping="toplevel"> 
    <xjc:serializable /> 
</jaxb:globalBindings> 

<jaxb:bindings schemaLocation="B1.xsd" 
    node="/xs:schema"> 

    <hj:persistence> 

     <hj:default-generated-id name="Hjid"> 
      <orm:generated-value strategy="IDENTITY" /> 
     </hj:default-generated-id> 

     <hj:default-entity> 
      <orm:table schema="B1_database_schema" /> 
     </hj:default-entity> 

    </hj:persistence> 

    <jaxb:schemaBindings> 
     <jaxb:package name="b1.package.name" /> 
    </jaxb:schemaBindings> 

</jaxb:bindings> 

任何人有一個想法,我怎麼可以編輯@ java.persitence.Entity的名稱參數?

回答

0

免責聲明:我是Hyperjaxb的作者。

答案是你不需要自定義這個。即如果你需要定製這個,有些事情是錯誤的。

您面臨的問題是因爲您爲A.xsd模式生成了兩組類,可能是在不同的包中。如果您有變色龍架構(A.xsd沒有目標名稱空間),或者您只編譯了兩次因爲您有B1.xsdB2.xsd,就可能出現這種情況。

正確的解決方案不是編譯A.xsd兩次。我希望你沒有變色龍模式(這是JAXB非常糟糕的設計模式)。在這種情況下,您可以將A.xsdB1.xsdB2.xsd編譯在一起,也可以分別編譯所有這些文件。您可以先編譯A.xsd,然後將它用作B1和B2中的插曲。關於它的工作方式,請參見Using Episodes

在任何情況下,您都不應該爲A.xsd類生成不同的包。

爲了回答您的具體問題 - 嘗試用自定義的複雜類型:

<hj:entity name="MyUniqueName"/> 

我想這應該覆蓋自動生成的名稱。然而這不是要走的路。

ps。這是一個測試項目集:

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/episodes

+0

你好@lexicore,謝謝你的回答。我知道這不是最好的解決方案,但使用hyperjaxb做瘋狂的事情比使用標準解決方案更有趣:) 有沒有辦法編輯所有複雜類型的名稱參數(例如給它們一個前綴)立刻?這會有幫助,因爲我有近100個。 – Erzen

+0

@Erzen那麼,如果你想要硬核,這是硬核。你可以編寫和配置你自己的命名策略。這裏是[示例](https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/custom-naming)。實現/覆蓋'Naming.getEntityName(...)'方法。 – lexicore