2011-03-22 20 views
7

मैंने अपना खुद का आईडीजीनरेटर लिखा है:हाइबरनेट: अनुक्रम जेनरेटर को मैन्युअल रूप से कॉल करें?

public class AkteIdGenerator implements IdentifierGenerator { 
    public Serializable generate(SessionImplementor session, Object object) 
     throws HibernateException { 
     // if custom id is set -> use this id 
     if (object instanceof SomeBean) { 
     SomeBean someBean = (SomeBean) object; 
     Long customId = someBean.getCustomId(); 
     if (customId != 0) { 
      return customId; 
     } 
     } 
     // otherwise --> call the SequenceGenerator manually 
     SequenceStyleGenerator sequenceGenerator ... 
    } 
} 

क्या कोई जानता है कि मैं अपने जेनरेटर क्लास से अनुक्रम जेनरेटर को कैसे कॉल कर सकता हूं जो मैं सामान्य रूप से प्रति एनोटेशन को परिभाषित कर सकता हूं:

@GeneratedValue(
     strategy = GenerationType.SEQUENCE, 
     generator = "MY_SEQUENCE") 
@SequenceGenerator(
     allocationSize = 1, 
     name = "MY_SEQUENCE", 
     sequenceName = "MY_SEQUENCE_NAME") 

मैं किसी के लिए बहुत आभारी हूं समाधान की!!!!

बहुत बहुत धन्यवाद, नॉरबर्ट

उत्तर

6

आप eassly अपने जेनरेटर वर्ग से SequenceGenerator कॉल कर सकते हैं। इस कोड को लिखकर। कस्टम जनरेटर वर्ग

public class StudentNoGenerator implements IdentifierGenerator { 

public Serializable generate(SessionImplementor session, Object object)throws HibernateException { 

    SequenceGenerator generator=new SequenceGenerator(); 
    Properties properties=new Properties(); 
    properties.put("sequence","Stud_NoSequence"); 
    generator.configure(Hibernate.STRING, properties, session.getFactory().getDialect()); 
    return generator.generate(session, session); 

} 

}
ऊपर कोड Stud_NoSequence में होना चाहिए अनुक्रम नाम है, जो बनाया जा shoulb है। create sequence Stud_NoSequence; हाइबरनेट.स्टिंग द्वारा डेटा बेस में डेटा प्रकार है जो अनुक्रम जेनरेटर कक्षा द्वारा वापस किया जाएगा।

और डोमेन वर्ग

import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.Id; 
    @Entity 
    @org.hibernate.annotations.GenericGenerator(
    name = "Custom-generator", 
    strategy = "com.ssis.id.StudentNoGenerator" 
    ) 
    public class Student { 
@Id @GeneratedValue(generator = "Custom-generator") 
String rno; 
@Column 
String name; 
public String getRno() { 
    return rno; 
} 
public void setRno(String rno) { 
    this.rno = rno; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
    } 
0

आपका पोस्ट किया जाएगा अनुक्रम के नाम को अपडेट करना मददगार था।

क्योंकि मैं प्रति माह अनुक्रम का उपयोग करता हूं, और कॉन्फ़िगरेशन प्रत्येक पहचानकर्ता पीढ़ी को अद्यतन नहीं करता है।

@Override 
public Serializable generate(SessionImplementor sessionImplementator, 
     Object object) throws HibernateException { 
    Calendar now = Calendar.getInstance(); 
    // If month sequence is wrong, then reconfigure. 
    if (now.get(Calendar.MONTH) != SEQUENCE_DATE.get(Calendar.MONTH)) { 
     super.configure(new LongType(), new Properties(), 
       sessionImplementator.getFactory().getDialect()); 
    } 
    Long id = (Long) super.generate(sessionImplementator, object); 
    String sId = String.format("%1$ty%1$tm%2$06d", SEQUENCE_DATE, id); 
    return Long.parseLong(sId);// 1301000001 
} 
संबंधित मुद्दे