veritabanında oluşturulduğu zaman bir varlık JavaDB ile EclipseLink kullanıyorum ve yeni bir kullanıcı varlığını sürdürmeye çalıştığımda her defasında yeni kullanıcı öğesinin kimlik alanıyla ilgili bir hata alıyorum boş. Null olduğunu biliyorum - ve kimlik alanı, veritabanındaki Kimlik olarak oluşturulmuş olması gerekir. Yoksa yanılıyor muyum? Varlığa @GeneratedValue eklemeyi denedim, ancak kullanılan üretim stratejisinden bağımsız olarak hatalara neden oluyor. Ayrıca here, here ve here'u da inceledim, ancak bu sorular sorunumla tamamen alakalı görünmüyor. Aşağıdaki istisnalar her zaman EntityManager.persist (kullanıcı) çağrısı sırasında gerçekleşir.Kimlik null olduğu ve otomatik olarak
Ayrıca, @NotNull ve @GeneratedValue öğesini kaldırmayı denedim ve garip bir şekilde, devam eden çağrıyı geçtim - ancak yalnızca taahhütte başarısız olmak için. Anladığım kadarıyla her şey doğru ayarlanmış. Yani soru şu: neden bu uygulama yeni bir kullanıcı ekleyemiyor ve bunu düzeltmek için ne yapmam gerekiyor? temelde
public void create(User user) throws PreexistingEntityException, RollbackFailureException, Exception {
EntityManager em = null;
try {
utx.begin();
em = getEntityManager();
em.persist(user);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception re) {
throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
}
if (findUser(user.getIdentifier()) != null) {
throw new PreexistingEntityException("User " + user + " already exists.", ex);
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
GenerationStrategy.Identity hatası (:
create table "USERSDBADMIN".USERS
(
IDENTIFIER BIGINT not null primary key GENERATED ALWAYS AS IDENTITY
(START WITH 0, INCREMENT BY 1),
USERNAME VARCHAR(50) not null,
EMAIL VARCHAR(150) not null,
LASTLOGIN DATE default NULL
);
Kullanıcı (JPA kontrol cihazından) Yöntemini oluşturun:
Kullanıcı varlık: Bu SQL Script Sorumlu
@Entity(name = "User")
@Table(name = "USERS")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "IDENTIFIER", nullable = false,unique = true)
private Long identifier;
// class shortened for brevity
}
Kimlik alanı boş olduğunu söyleyerek):
ex = (javax.validation.ConstraintViolationException) javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.
GenerationStrategy.Sequence hatası (Tablo ve Otomatik aynı istisna üretmek):
ex = (org.eclipse.persistence.exceptions.DatabaseException) Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException. Internal Exception: java.sql.SQLSyntaxErrorException: SEQUENCE 'SEQ_GEN_SEQUENCE' does not exist. Call: VALUES(NEXT VALUE FOR SEQ_GEN_SEQUENCE) Query: ValueReadQuery(sql="VALUES(NEXT VALUE FOR SEQ_GEN_SEQUENCE)")
Bu çok daha iyi bir çözüm - Artık kimlik tanıtımı hakkında umurumda değil! Göndermeden önce denemeliydim - ama işe yarıyor. Teşekkürler Lukas! –