Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠:手动调用SequenceGenerator?_Java_Hibernate_Jpa - Fatal编程技术网

Java 休眠:手动调用SequenceGenerator?

Java 休眠:手动调用SequenceGenerator?,java,hibernate,jpa,Java,Hibernate,Jpa,我已经编写了自己的IdGenerator: public class AkteIdGenerator implements IdentifierGenerator { public Serializable generate(SessionImplementor session, Object object) throws HibernateException { // if custom id is set -> use this id i

我已经编写了自己的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")
我将非常感谢任何解决方案


非常感谢,Norbert

您可以从生成器类轻松调用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是应该创建的序列名。在数据库中通过wring
创建序列Stud\u NoSequence
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;
}
    }

您的帖子有助于更新序列的名称

因为我每月使用一个序列,并且配置不会更新每个标识符生成

这是我的密码:

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

不确定这是否有用,但我在搜索我的答案时不断看到这篇文章,我没有在任何地方找到答案,但我自己找到了解决方案。所以我想这可能是最好的分享的地方

如果使用hibernate作为JPA提供程序,则可以手动调用分配给给定实体类的ID生成器。首先插入JPA文本:

@Autowired
org.springframework.data.jpa.repository.JpaContext;
然后使用以下命令获取内部org.hibernate.id.IdentifierGenerator:

org.hibernate.engine.spi.SessionImplementor session=jpaContext.getEntityManagerByManagedType(MyEntity.class).unwrap(org.hibernate.engine.spi.SessionImplementor.class);
org.hibernate.id.IdentifierGenerator generator=session.getEntityPersister(null,new MyEntity()).getIdentifierGenerator();
现在,您可以通过编程方式从生成器获取ID:

Serializable id=generator.generate(session,new MyEntity());
  @Id
  @GenericGenerator(name = "seq_id", strategy = "de.generator.AkteIdGenerator")
  @GeneratedValue(generator = "seq_id")
  @Column(name = "ID")
  private Integer Id;