2011-03-22 70 views
7

我写我自己的IdGenerator:休眠:手动调用SequenceGenerator?

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 ... 
    } 
} 

有谁知道我怎么会从我的生成器类调用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; Hibernate.String是由SequenceGenerator类返回的类型。

和领域类是

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 
}