【问题标题】:quarkus and hibernate mapping (field access)quarkus 和休眠映射(字段访问)
【发布时间】:2019-11-28 19:23:32
【问题描述】:

我将一个在 JEE wildfly 中工作的实体移到了 quarkus:

@Entity
@Getter
@Setter
public class Item {

@Column(name = "archived")
private OffsetDateTime archived;

public boolean isArchived() {
    return archived != null;
}
}

在开发模式下运行后,我得到这个错误:


Caused by: org.hibernate.MappingException: 
In trying to locate getter for property [archived], 
Class [com.Item] 
defined both a `get` [public java.time.OffsetDateTime com.Item.getArchived()] 
and `is` [public boolean com.Item.isArchived()] variant
    at org.hibernate.internal.util.ReflectHelper.checkGetAndIsVariants(ReflectHelper.java:538)
    at org.hibernate.internal.util.ReflectHelper.verifyNoGetVariantExists(ReflectHelper.java:562)
    at org.hibernate.internal.util.ReflectHelper.getGetterOrNull(ReflectHelper.java:502)
    at org.hibernate.internal.util.ReflectHelper.findGetterMethod(ReflectHelper.java:424)
    at org.hibernate.internal.util.ReflectHelper.getterMethodOrNull(ReflectHelper.java:571)
    at org.hibernate.property.access.internal.PropertyAccessMixedImpl.getAccessType(PropertyAccessMixedImpl.java:97)
    at org.hibernate.property.access.internal.PropertyAccessMixedImpl.<init>(PropertyAccessMixedImpl.java:47)
    at org.hibernate.property.access.internal.PropertyAccessEnhancedImpl.<init>(PropertyAccessEnhancedImpl.java:28)
    at org.hibernate.property.access.internal.PropertyAccessStrategyEnhancedImpl.buildPropertyAccess(PropertyAccessStrategyEnhancedImpl.java:27)
    at org.hibernate.mapping.Property.getGetter(Property.java:311)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:255)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:142)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:59)
    ... 35 more

我明白这个错误,但我不知道为什么这个休眠映射在wildfly而不是quarkus中工作?当我声明 jpa field access 而不是 jpa property access 时,hibernate 应该会自动将isArchived() 视为transient

或者 quarkus 是否将所有这些场注入编译为属性注入?

【问题讨论】:

    标签: quarkus


    【解决方案1】:

    Quarkus 为archived 字段生成一个getter。 在这里,Hibernate 抱怨您有两个 archived 字段的访问器:isArchived()getArchived()

    这是一个 Hibernate 问题/限制,与 Quarkus 无关。

    我认为最好的方法是将您的isArchived() 方法重命名为Hibernate 不知道使用哪种方法来检索archived 字段的值。如果您将 @Transient 添加到您的 isArchived() 方法中,它可以(取决于它首先获得的方法)将您的字段作为瞬态处理。

    【讨论】:

    • 我在 JEE 环境(也是休眠状态)中使用了上面描述的这个映射,它一直在没有抱怨的情况下工作......在将此实体移动到 quarkus 之后......我得到了这个抱怨(使用 SAME 休眠版本)。 quarkus 是否使用 字节码增强 或 jpa 属性访问,即使我通过 jpa 字段访问“ 声明我的映射?我的实体声明了 jpa字段访问”,这意味着:休眠应该考虑我的属性。但在夸库斯中确实如此。为什么?
    • 正如我所说,Quarkus 为 Hibernate 生成 getter 和 setter。你也有生成它们的龙目岛,我认为对吗?所有这些都在 Hibernate 上产生了问题。如果你真的认为这是 Quarkus 方面的问题,请在此处打开一个问题:github.com/quarkusio/quarkus/issues
    • “Quarkus 为 Hibernate 生成 getter 和 setter”。我不这么认为,因为我不将 Panache 用于公共领域。正如我之前所说,相同的映射在 JEE 环境中工作。我使用字段访问而不是属性访问..
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多