javax.persistence PROPERTY访问自定义getter / setter名称

时间:2017-04-12 08:49:35

标签: hibernate jpa

我的实体的实现已生成,我几乎无法控制它。我面临的主要问题是布尔字段getter方法有不同的命名约定:is<FieldName>()

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>()方法?

1 个答案:

答案 0 :(得分: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提供程序应该观察它。如果它没有,那么你应该在它上面提出一个错误。