2017-04-12 62 views
0

生成我的實體的實現,並且我幾乎無法控制它。我面臨的主要問題是布爾字段getter方法具有不同的命名約定:is<FieldName>()javax.persistence PROPERTY訪問自定義getter/setter名稱

public class Bookmark { 
    /** 
    * @generated 
    */ 
    public boolean isIsPrivate() { 
     ... 
    } 

    /** 
    * @generated 
    */ 
    public void setIsPrivate(boolean newIsPrivate) { 
     ... 
    } 

}

的具體實施缺乏實際領域的實體,我知道這聽起來很瘋狂,但它是怎麼回事。因此,我需要使用PROPERTY訪問權限。既然不能修改如何生成的代碼,我在一個orm.xml中映射文件這樣做:

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings version="2.1" 
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd"> 

<persistence-unit-metadata> 
    <xml-mapping-metadata-complete/> 
</persistence-unit-metadata> 
<package>org.hibernate.ogm.backendtck.type.ogmemf.impl</package> 
... 
<entity class="Bookmark" access="PROPERTY"> 
    <attributes> 
     <basic name="isPrivate"/> 
    </attributes> 
</entity> 
</entity-mappings> 

然而,這將導致的Hiberante尋找getIsPrivate()方法,即不存在。

由於我需要使用PROPERTY訪問,但我的get方法不遵循JavaBeens約定,有沒有什麼辦法可以說服hiberante查找特定的方法或模式,以便我可以映射is<FieldName>()方法?

+0

請不要分享代碼。 –

+1

嗯......'是()'已經遵循約定,除非它是一個'java.lang.Boolean'而不是一個原始'boolean' – crizzis

回答

1

按照JPA規範第2.2節

In this case, for every persistent property property of type T of the 
entity, there is a getter method, getProperty, and setter method 
setProperty. For boolean properties, isProperty may be used as an 
alternative name for the getter method. [2] 

For single-valued persistent properties, these method signatures are: 
• T getProperty() 
• void setProperty(T t) 

因爲你的財產是布爾然後isProperty是一個有效的名字和你的JPA提供者應當遵守它。如果沒有,那麼你應該提出一個錯誤。