2012-09-20 21 views
12

Oldukça çok başlıkta yazıyor. Ben şuna benzer bir sınıf var: Oracle 11g kullanmaBir dizeyi Hazırda Bekletme dizisinde DB dizisine eşleme nasıl yapılır

@Entity 
@Table(name="FOO") 
public class Foo { 

    private String theId; 

    @Id 
    @Column(name = "FOO_ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "fooIdSeq") 
    @SequenceGenerator(name = "fooIdSeq", sequenceName = "SQ_FOO_ID", allocationSize = 10) 
    public String getTheId() { return theId; } 

    public String setTheId(String theId) { this.theId = theId; } 
} 

, FOO_ID sütunu VARCHAR2 olmakla dizisi SQ_FOO_ID bir NUMBER verir. Veritabanının görünüşte bundan memnun olduğu ancak uygulamanın, uygulamanın dışında bu sütuna eklenmiş olan sayısal olmayan kimlikleri desteklemesi gerekiyor.

Yukarıdaki kodu dikkate alarak, bir org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String aldım. Bu haritalamayı yapmanın bir yolu var mı?

Hazırda Bekletme 3.6.

cevap

10

Özel bir IdentifierGenerator sınıfı uygulayın; blog post bir den:

import java.io.Serializable; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.id.IdentifierGenerator; 

public class StringKeyGenerator implements IdentifierGenerator { 

    @Override 
    public Serializable generate(SessionImplementor session, Object collection) throws HibernateException { 
     Connection connection = session.connection(); 
     PreparedStatement ps = null; 
     String result = ""; 

     try { 
      // Oracle-specific code to query a sequence 
      ps = connection.prepareStatement("SELECT TABLE_SEQ.nextval AS TABLE_PK FROM dual"); 
      ResultSet rs = ps.executeQuery(); 

      if (rs.next()) { 
       int pk = rs.getInt("TABLE_PK"); 

       // Convert to a String 
       result = Integer.toString(pk); 
      } 
     } catch (SQLException e) { 
      throw new HibernateException("Unable to generate Primary Key"); 
     } finally { 
      if (ps != null) { 
       try { 
        ps.close(); 
       } catch (SQLException e) { 
        throw new HibernateException("Unable to close prepared statement."); 
       } 
      } 
     } 

     return result; 
    } 
} 

Annotate böyle varlık PK:

@Id 
@GenericGenerator(name="seq_id", strategy="my.package.StringKeyGenerator") 
@GeneratedValue(generator="seq_id") 
@Column(name = "TABLE_PK", unique = true, nullable = false, length = 20) 
public String getId() { 
    return this.id; 
} 

nedeniyle Eclipse bir hatadan bir hata jeneratörü (seq_id) sebat birimi tanımlanmamış olduğu ileri sürülebilen . aşağıdaki gibi bir uyarı bu ayarlayın:

  1. Seç Pencere »Tercihler
  2. Java Persistence» JPA »Hatalar/Uyarılar
  3. tıklayın Sorgular ve jeneratörler Expand
  4. Set Jeneratör olduğunu Kalıcı birim için tanımlanmamıştır: Warning
  5. Click Tamam değişiklikleri uygulamak için ve bu başka bir yaklaşımdır iletişim
3

kapatmak:

@Id 
@GenericGenerator(name = "STRING_SEQUENCE_GENERATOR", strategy = "mypackage.StringSequenceGenerator", parameters = { @Parameter(name = "sequence", value = "MY_SEQUENCE_NAME") }) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "STRING_SEQUENCE_GENERATOR") 
@Column(name = "MY_ID") 
public String getMyId() { 
    return this.myId; 
} 
:

import java.io.Serializable; 

import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.id.IdentifierGeneratorHelper.BigDecimalHolder; 
import org.hibernate.id.IntegralDataTypeHolder; 
import org.hibernate.id.SequenceGenerator; 

public class StringSequenceGenerator extends SequenceGenerator { 
    @Override 
    public Serializable generate(SessionImplementor session, Object obj) { 
     return super.generate(session, obj).toString(); 
    } 

    protected IntegralDataTypeHolder buildHolder() { 
     return new BigDecimalHolder(); 
    } 
} 

dizi parametre aşağıdaki örnekte olduğu gibi id mülkiyet üzerinde belirlenmek zorundadır

İlgili konular