[英]Hibernate: Call a SequenceGenerator manually?
我寫了自己的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")
我會非常感謝任何解決方案!!!!
非常感謝,諾伯特
您可以通過Generator類調用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 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;
}
}
@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/
不確定這是否有幫助,但我在搜索我的答案時一直看到這個帖子,我在任何地方找不到,但我自己找到了解決方案。 所以我認為這可能是分享的最佳場所。
如果您使用hibernate作為JPA提供程序,則可以手動調用分配給給定實體類的ID生成器。 首先注入JpaContext:
@Autowired
org.springframework.data.jpa.repository.JpaContext 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());
您的帖子有助於更新序列的名稱。
因為我每月使用一個序列,並且配置不會更新每個標識符生成。
這是我的代碼:
@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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.