Eclipselink ValidationException - PullRequest
       16

Eclipselink ValidationException

3 голосов
/ 25 июля 2011

Я пытаюсь адаптировать мою модель данных для использования базового класса BaseEntity.Следующий код представляет общую идею:

    @MappedSuperclass
    public abstract class BaseEntity implements HasAuditInfo {
        @Id
        @GeneratedValue
        private Long id;
        @Column(unique = true, nullable = false)
        private String uuid;
        private Long createdById;
        @Temporal(value = TemporalType.TIMESTAMP)
        @Column(nullable = false)
        private Date createdOn;
        private Long changedById;
        @Temporal(value = TemporalType.TIMESTAMP)
        @Column(nullable = false)
        private Date changedOn;
        @Column(nullable = false)
        private Long changedOnValue;
        private Boolean active;
        private Long deactivatedById;
        @Temporal(value = TemporalType.TIMESTAMP)
        private Date deactivatedOn;
        @NotNull
        @DecimalMin("0")
        private Integer version = 0;
        private Long domainId;

        [... Getters/Setters etc ...]
}

Ниже приведен пример производного объекта:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Address extends BaseEntity implements Serializable, Comparable<Address> {
    private static final long serialVersionUID = 6301090657382674578L;
    // Address Fields
    @NotBlank(message = "Address Line 1 is a mandatory field.")
    private String addressLine1;
    private String addressLine2;
    private String country;
    @NotBlank(message = "Region is a mandatory field.")
    private String region;
    @NotBlank(message = "City is a mandatory field.")
    private String city;
    @NotBlank(message = "Zipcode is a mandatory field.")
    private String zipcode;

    [... Getters/Setters etc ...]
}

Если я правильно понимаю документацию JPA, это должно быть прекраснодопустимо, но я получаю следующую ошибку от EclipseLink при развертывании моего кода:

В классе сущности [class com.xyzAddress] первичный ключ не указан.Он должен определять либо @Id, @EmbeddedId, либо @IdClass.Если вы определили PK с помощью любой из этих аннотаций, убедитесь, что в вашей иерархии классов сущностей нет смешанного типа доступа (аннотированные поля и свойства).

Я пробовал несколькочто можно обойти:

  • Обновление до EclipseLink 2.3 (в настоящее время я использую 2.2)
  • Делаем BaseEntity не абстрактным
  • Перемещение аннотации @Id иполе непосредственно в Address
  • Аннотирование метода getId () вместо поля как в BaseEntity, так и в Address.

Ни один из этих подходов не имел никакого эффекта, за исключением переноса моего кода вHibernate (или какая-то другая, лучше, реализация JPA), я могу что-нибудь сделать?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Решение состоит в том, чтобы явно назвать каждый столбец в BaseEntity следующим образом:

@MappedSuperclass
public abstract class BaseEntity {
       @Id
       @GeneratedValue
       @Column(name = "id")
       @SearchableId
       protected Long id;
       @Column(name = "uuid", unique = true, nullable = false)
       protected String uuid;
       @Column(name = "createdById")
       protected Long createdById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "createdOn", nullable = false)
       protected Date createdOn;
       @Column(name = "changedById")
       protected Long changedById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "changedOn", nullable = false)
       protected Date changedOn;
       @Column(name = "changedOnValue", nullable = false)
       protected Long changedOnValue;
       @Column(name = "active")
       protected Boolean active;
       @Column(name = "deactivatedById")
       protected Long deactivatedById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "deactivatedOn")
       protected Date deactivatedOn;
       @Version
       @Column(name = "version")
       protected Integer version = 0;
       @Column(name = "domainId")
       protected Long domainId;
0 голосов
/ 26 июля 2011

Вы не должны получить эту ошибку.И определенно нет, если вы переместите @Id в адрес.

Вы уверены, что перекомпилировали / развернули свой код после внесения изменений?

Если вы удалите наследование TABLE_PER_CLASS, это сработает?(у Address есть подклассы?)

...