Hibernate Sequence Id генератор не используется - PullRequest
0 голосов
/ 27 мая 2019

Я хочу сгенерировать идентификатор последовательности в этом формате 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

1 Ответ

0 голосов
/ 27 мая 2019

Пожалуйста, используйте полный путь к вашему ReferenceSequenceGenerator

 @GenericGenerator(
        name="reference",
        strategy = "Neos.ReferenceSequenceGenerator",
        parameters = {
                @Parameter(name=ReferenceSequenceGenerator.DATE_FORMAT_PARAMETER , value="%tY")
        }
)
...