Я пытаюсь адаптировать мою модель данных для использования базового класса 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), я могу что-нибудь сделать?