Hibernate: вызвать SequenceGenerator вручную? - PullRequest
7 голосов
/ 22 марта 2011

Я написал свой собственный IdGenerator:

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

Буду очень благодарен за любые решения !!!!

Большое спасибо, Норберт

Ответы [ 3 ]

6 голосов
/ 14 октября 2011

Вы можете легко вызвать SequenceGenerator из вашего класса Generator. Написав этот код. Пользовательский класс генератора должен быть

 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 - это имя последовательности, которое должно быть создано. в базе данных по wring 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;
}
    }
1 голос
/ 20 июня 2013
  @Id
  @GenericGenerator(name = "seq_id", strategy = "de.generator.AkteIdGenerator")
  @GeneratedValue(generator = "seq_id")
  @Column(name = "ID")
  private Integer Id;

http://blog.anorakgirl.co.uk/2009/01/custom-hibernate-sequence-generator-for-id-field/

0 голосов
/ 02 января 2013

Ваш пост был полезен для обновления названия последовательности.

Поскольку я использую последовательность в месяц, и конфигурация не обновляет каждое поколение идентификаторов.

Вот мой код:

@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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...