Getting "Incompatible types: HibernateProxy and ErrorRowError" when upgrading to Micronaut4

191 Views Asked by At

I am upgrading our application to Micronaut 4 (from 3). Their guide states we have to migrate from javax to jakarta.

Here is one of the classes that is causing the error (kotlin):

import java.util.UUID
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.Table
import org.hibernate.annotations.BatchSize
import org.hibernate.proxy.HibernateProxy

@Entity
@Table(name = ERROR_ROW_ERROR, schema = SCHEMA)
@BatchSize(size = BATCH_SIZE)
data class ErrorRowError(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id: UUID? = null,
    @Column(name = "error")
    val error: String,
    @ManyToOne
    @JoinColumn(name = "error_row_id", nullable = false)
    var errorRow: ErrorRow? = null
) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other == null) return false
        val oEffectiveClass =
            if (other is HibernateProxy) other.hibernateLazyInitializer.persistentClass else other.javaClass
        val thisEffectiveClass =
            if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass else this.javaClass
        if (thisEffectiveClass != oEffectiveClass) return false
        other as ErrorRowError

        return id != null && id == other.id
    }

    override fun hashCode(): Int = javaClass.hashCode()

    @Override
    override fun toString(): String {
        return this::class.simpleName + "(id = $id , error = $error , errorRow = $errorRow )"
    }

}

when I replace javax with jakarta I am getting:

Incompatible types: HibernateProxy and ErrorRowError on the line where thisEffectiveClass is created.

Any idea on how to solve this?

1

There are 1 best solutions below

1
Bart Romano On BEST ANSWER

Ok I got it! I had to add jakarta.persistence.Entity to the allOpen plugin! That solved the issue.

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>${kotlinVersion}</version>
    <configuration>
        <compilerPlugins>
            <plugin>all-open</plugin>
            <plugin>jpa</plugin>
        </compilerPlugins>
        <pluginOptions> 
            <option>all-open:annotation=jakarta.persistence.Entity</option>
         </pluginOptions>    
    </configuration>
    ...
    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-allopen</artifactId>
            <version>${kotlinVersion}</version>
        </dependency>
        ...