0
votes

I moved an entity which worked in JEE wildfly to quarkus:

@Entity
@Getter
@Setter
public class Item {

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

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

After running in dev-mode, I get this error:


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

I understand the error but I dont know why does this hibernate mapping work in wildfly and not in quarkus? As I declared jpa field access instead of jpa property access, hibernate should see the isArchived() automatically as transient.

Or does quarkus compiles all these field-injections to property-injections?

1

1 Answers

0
votes

Quarkus generates a getter for the archived field. Here Hibernate complains that you have two accessors for the archived field: isArchived() and getArchived().

This is an Hibernate issue/limitation, nothing specific to Quarkus.

I think the best is to rename your isArchived() method as Hibernate don't know which method to use to retrieve the value of the archivedfield. And if you add @Transient to your isArchived() method it could (depending on wich method it get first) handle your field as transient.