Спящий режим - подкласс должен быть привязан после его материнского класса

после обновления спящего режима с версии 4.3.7.Final до 5.3.18.Final я получил следующую ошибку

@Entity
@Audited
@AuditPermission(Permission.VIEW_INDIVIDUAL)
public class Individual implements ITemporalEntity {

    @Id
    @Column(name = "Individual_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Individual_generator")
    @SequenceGenerator(name = "Individual_generator", initialValue = 1, allocationSize = 1, sequenceName = "Individual_id_seq")
    private Long id;
    @Embedded
    private TemporalEntity temporal = new TemporalEntity();
    @Override
    public DateTime getCreateDate() {
     return temporal.getCreateDate();
    }

    @Override
    public void setCreateDate(DateTime createDate) {
     temporal.setCreateDate(createDate);

    }
    .......
    ...

   }

Класс TemporalEntity

@Embeddable
public class TemporalEntity {

@Column(updatable = false)
private DateTime createDate;

@Column
private DateTime lastModifiedDate;

@ManyToOne
@JoinColumn(name = "created_by_id", updatable = false)
private AdminUser createdBy;

@ManyToOne
@JoinColumn(name = "last_modified_by_id")
private AdminUser lastModifiedBy;

@Column(nullable = false, columnDefinition = "boolean not null default false")
private boolean deleted = false;

public DateTime getCreateDate() {
    return createDate;
}

public void setCreateDate(DateTime createDate) {
    if (createDate == null) {
        //ignore attempts to clear this field
        return;
        //throw new IllegalStateException("Null create date not allowed");
    }
    this.createDate = createDate;
}

public DateTime getLastModifiedDate() {
    return lastModifiedDate;
}

public void setLastModifiedDate(DateTime lastModifiedDate) {
    if (lastModifiedDate == null) {
        //ignore attempts to clear this field
        return;
        //throw new IllegalStateException("Null last modified date not allowed");
    }
    this.lastModifiedDate = lastModifiedDate;
}

public AdminUser getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(AdminUser createdBy) {
    if (createdBy == null) {
        //ignore attempts to clear this field
        return;
        //throw new IllegalStateException("Null created by not allowed");
    }
    this.createdBy = createdBy;
}

public AdminUser getLastModifiedBy() {
    return lastModifiedBy;
}

public void setLastModifiedBy(AdminUser lastModifiedBy) {
    if (lastModifiedBy == null) {
        //ignore attempts to clear this field
        return;
        //throw new IllegalStateException("Null lastModifiedBy not allowed");
    }
        this.lastModifiedBy = lastModifiedBy;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

}

Интерфейс ITemporalEntity

public interface ITemporalEntity {

    public DateTime getCreateDate();

    public void setCreateDate(DateTime createDate);

    public DateTime getLastModifiedDate();

    public void setLastModifiedDate(DateTime lastModifiedDate);

    public AdminUser getCreatedBy();

    public void setCreatedBy(AdminUser createdBy);

    public AdminUser getLastModifiedBy();

    public void setLastModifiedBy(AdminUser lastModifiedBy);

    public boolean isDeleted();

    public void setDeleted(boolean deleted);

}

стек ошибок

an assertion failure occurred (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: Subclass has to be binded after it's mother class: com.berwick.dal.TemporalEntity
23:11:29,486 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 87) MSC000001: Failed to start service jboss.persistenceunit."bds-core-1.0-SNAPSHOT.war#com.berwick.dal": org.jboss.msc.service.StartException in service jboss.persistenceunit."bds-core-1.0-SNAPSHOT.war#com.berwick.dal": org.hibernate.AssertionFailure: Subclass has to be binded after it's mother class: com.berwick.dal.TemporalEntity
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:198) [wildfly-jpa-21.0.0.Final.jar:21.0.0.Final]

Мои попытки решить проблему

добавить @MappedSuperclass в класс TemporalEntity, чтобы эта ошибка исчезла, но я получил больше ошибок

Duplicate generator name Individual_generator you will likely want to set the property hibernate.jpa.compliance.global_id_generators to false 
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:198) [wildfly-jpa-21.0.0.Final.jar:21.0.0.Final]

person Mina Fawzy    schedule 04.11.2020    source источник
comment
Вы пытались изменить имя генератора?   -  person fr3ddie    schedule 12.11.2020
comment
Проверьте этот поток и второй ответ: stackoverflow.com/questions/29278249/   -  person fr3ddie    schedule 12.11.2020
comment
да, я знаю, что спящий режим не поддерживает наследование, поэтому я создаю интерфейс ITemporalEntity, затем создаю новый экземпляр и реализую все поля, как показано @Embedded private TemporalEntitytemporalEntitytemporalEntity();   -  person Mina Fawzy    schedule 12.11.2020


Ответы (1)


Вопрос очень похож на заданный в связанной ветке. Отображение ошибок Встроенный класс, доступный через интерфейс

напишите имя класса сущностей, которое вы хотите встроить в аннотацию @target

   @Embedded
   @Target(TemporalEntity.class)
   private ITemporalEntity temporal;
   
   

вам не нужно тесно связывать TemporalEntity, создавая новый встроенный объект, сделайте это

person Nasir Hussain    schedule 15.11.2020
comment
Спасибо за ответ, но могу ли я исправить это, вероятно, захочу установить для свойства hibernate.jpa.compliance.global_id_generators значение false - person Mina Fawzy; 16.11.2020
comment
есть два шаблона, которые мы можем использовать либо «композицию», либо «наследование». с '@embedded' и '@Embeddable' вы используете шаблон композиции. Я думаю, что используя @MappedSuperclass, вы используете наследование. Наследование создает дополнительную проблему. Лучше использовать состав. - person Nasir Hussain; 16.11.2020
comment
Я сделал это изменение, но все равно получаю ту же ошибку. Подкласс должен быть привязан после материнского класса. - person Mina Fawzy; 17.11.2020