Я хочу сгенерировать идентификатор последовательности в этом формате 2019NEO0125
, где 00125 происходит из спящего секвенсора.это мой код источника:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name="tabe")
public class Neos implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id()
@Column
@GenericGenerator(
name="reference",
strategy = "ReferenceSequenceGenerator",
parameters = {
@Parameter(name=ReferenceSequenceGenerator.DATE_FORMAT_PARAMETER , value="%tY")
}
)
@GeneratedValue(generator = "reference")
private Long reference;
//....
и генератор
import java.io.Serializable;
import java.util.Calendar;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.type.LongType;
import org.hibernate.type.Type;
import Neos;
public class ReferenceSequenceGenerator extends SequenceStyleGenerator{
public static final String DATE_FORMAT_PARAMETER = "date_format";
public static final String DATE_FORMAT_DEFAULT = "%tY-%tm";
public static final String NUMBER_FORMAT_PARAMETER = "number_format";
public static final String NUMBER_FORMAT_DEFAULT = "%05d";
public static final String ROOT_PARAMETER = "root";
public static final String ROOT_DEFAULT = "NEO";
public static final String SEPARATOR = "separator";
public static final String SEPARATOR_DEFAULT = "";
private String format;
@Override
public Serializable generate(SessionImplementor session,
Object object) throws HibernateException {
return String.format(format, Calendar.getInstance() , ((Neos)object).getClient(), super.generate(session, object));
}
@Override
public void configure(Type type, Properties params,
Dialect d) throws MappingException {
super.configure(new LongType(), params, d);
String dateFormat = params.getProperty(DATE_FORMAT_PARAMETER, DATE_FORMAT_DEFAULT).replace("%" , "%1$");
String numberFormat = params.getProperty(NUMBER_FORMAT_PARAMETER , NUMBER_FORMAT_DEFAULT).replace("%" , "%2$");
String dateNumberSeparator = params.getProperty(SEPARATOR , SEPARATOR_DEFAULT);
String root = params.getProperty(ROOT_PARAMETER , ROOT_DEFAULT);
System.out.println(dateFormat + " -- " + numberFormat + " -- " + dateNumberSeparator );
this.format = dateFormat+root+dateNumberSeparator+numberFormat;
}
}
Все скомпилировано и с тех пор работает нормально.но когда я пытаюсь увидеть данные в базе данных, я получаю следующие идентификаторы:
1
2
3
4
5
Я думаю, что мой генератор не вызывается.Я добавил System.out.println
в функцию генерации, но она не распечатывается при сохранении сущности.
Я пытаюсь изменить тип свойства reference
на строку.Я получаю исключение:
"org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.afb.dsi.scoring.jpa.Credit.reference",
"could not set a field value by reflection setter of com.afb.dsi.scoring.jpa.Credit.reference",
"Can not set java.lang.String field com.afb.dsi.scoring.jpa.Credit.reference to java.lang.Long"
Примечание:
hibernate-аннотации: 3.5.6-Final
deltaspike: 1.8.1
jpa: 2,0