2014-12-21 18 views
7

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)") 

cevap

10

@NotNull eksilerini kullanmayın GenerationType.IDENTITY stratejisi kullanılarak oluşturulan @Id özniteliği üzerinde traint. Sorun, @NotNull ve diğer JSR-303 kısıtlamaları işlemden önce doğrulanır. Ve otomatik olarak doldurulmuş tanımlayıcı, taahhüt tamamlanana kadar kullanılamaz.

bu deneyin ve bir daha kimlik başlatma umurumda değil: did it

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "IDENTIFIER", nullable = false, unique = true) 
private Long identifier; 
+0

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! –

0

Ben tanımlayıcı olarak oto artışı kullanıyorum böyle yapın: Bu ek açıklamasıyla

User user = new User(); 
user.setIdentifier((long) 0);// Assign 0 to ID for MSSQL/MySQL to properly auto_increment the primary key. 
user.setUserName("some name"); 
... 

kimlik için:

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@NotNull 
@Column(name = "ID") 
private Long id; 
+0

Welp. Ama Wtf adam? Kimlik alanını neden ayarlamak zorundayım? Yani JPA otomatik olarak ayarlamalıdır. –

+0

Kimlik alanını ayarlamak zorunda değilim - kabul edilen cevaba bakın. Ayrıca, kimliğin sıfıra ayarlanması, bir şeylerin sıfıra gitmesine neden olacaktır, çünkü Tanımlayıcılarımı sıfırla başlatıyorum (SQL'e bakınız). -1 işe yaramadı ama hiç denemedim. –