GVKun编程网logo

如何对非ID字段使用序列生成器?(如何对非id字段使用序列生成器进行处理)

7

在本文中,我们将给您介绍关于如何对非ID字段使用序列生成器?的详细内容,并且为您解答如何对非id字段使用序列生成器进行处理的相关问题,此外,我们还将为您提供关于Fluid版本中如何使用序列数据?、hi

在本文中,我们将给您介绍关于如何对非ID字段使用序列生成器?的详细内容,并且为您解答如何对非id字段使用序列生成器进行处理的相关问题,此外,我们还将为您提供关于Fluid版本中如何使用序列数据?、hibernate中使用序列生成主键、Hibernate:如何使用注释指定自定义序列生成器的类名?、java – 这个线程安全的字节序列生成器有什么问题?的知识。

本文目录一览:

如何对非ID字段使用序列生成器?(如何对非id字段使用序列生成器进行处理)

如何对非ID字段使用序列生成器?(如何对非id字段使用序列生成器进行处理)

public class SequenceControlNumber extends SequenceGenerator {

    private static final Logger log =        LoggerFactory.getLogger(SequenceGenerator.class);    @Override    public Serializable generate(SessionImplementor session, Object obj) {        Connection connection = session.connection();        try {            PreparedStatement st = connection.prepareStatement                   ("SELECT nextval (''sequencecontrolnumber'') as nextval");            try {                ResultSet rs = st.executeQuery();                try {                    rs.next();                    int currentVall = rs.getInt("sequencecontrolnumber");                    int result = 0;                    if(currentVall <255){                        result = currentVall +1;                    }                    if ( log.isDebugEnabled() ) {                        log.debug("Sequence identifier generated: " + result);                    }                    return result;                }                finally {                    rs.close();                }            }            finally {                session.getBatcher().closeStatement(st);            }        }        catch (SQLException sqle) {            throw JDBCExceptionHelper.convert(                    session.getFactory().getSQLExceptionConverter(),                    sqle,"could not get next sequence value");        }    }}

在我的模型类中,这是我的注释:

@GenericGenerator(name="seq_id",        strategy="br.com.otgmobile.service.dao.SequenceControlNumber")@GeneratedValue(generator="seq_id")@Column(name="sequencecontrolnumber",unique=false, nullable=false)private Integer sequenceControlNumber;

但我不断收到一个属性值异常。

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.otgmobile.model.niagarahw06.ComandoNiagaraHw06.sequenceControlNumberat org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1179)at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112)at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1118)at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:618)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)at $Proxy33.persist(Unknown Source)at br.com.otgmobile.service.dao.ComandoNiagaraHw06DAO.add(ComandoNiagaraHw06DAO.java:57)at br.com.otgmobile.service.dao.ComandoNiagaraHw06DAO$$FastClassByCGLIB$$e19cf51d.invoke(<generated>)at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)at br.com.otgmobile.service.dao.ComandoNiagaraHw06DAO$$EnhancerByCGLIB$$69ccb4e4.add(<generated>)at br.com.otgmobile.server.NiagaraSocketManager.testPersistComandos(NiagaraSocketManager.java:100)at br.com.otgmobile.server.NiagaraSocketManager.start(NiagaraSocketManager.java:45)at br.com.otgmobile.server.NiagaraDaemon.run(NiagaraDaemon.java:25)at java.lang.Thread.run(Thread.java:722)Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.otgmobile.model.niagarahw06.ComandoNiagaraHw06.sequenceControlNumberat org.hibernate.engine.Nullability.checkNullability(Nullability.java:101)at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:612)

答案1

小编典典

检查类中resultgenerate方法返回的值SequenceControlNumber

BTW在以下SO问题中检查此响应:hibernateJPA序列(非ID)

Fluid版本中如何使用序列数据?

Fluid版本中如何使用序列数据?

  • 问题描述:在旧版的Paddle中可以使用三种序列格式来使用序列数据,但在Fluid版中这些功能都消失了,那我现在该如何在Fluid版的Paddle中使用序列数据呢?

  • 问题分析:
    Fluid版是一个比较大的改进版本,从多方面考虑后,并没有很完美的向后兼容,这就造成旧版Paddle中的方法并不能再Fluid使用,在Fluid中所有的数据类型都为LoD-Tensor,对于不存在序列信息的数据(如此处的变量X),其lod_level=0,如果是存在序列的数据则根据需求设置不同的lod_level则可。

  • 问题解决:

可以直接使用fluid.create_lod_tensor()方法来使用序列数据,该方法的主要作用就是从numpy数组,表或现有的lod张量创建lod张量。实例如下:

import paddle.fluid as fluid

data1 = [[211]]  
data2 = [[6]]  
lod = [[1]]

place = fluid.CPUPlace()

first_word = fluid.create_lod_tensor(data1, lod, place)
second_word = fluid.create_lod_tensor(data2, lod, place)

更多细节可以参考LoDTensor文档:http://www.paddlepaddle.org/documentation/docs/zh/1.1/user_guides/howto/prepare_data/lod_tensor.html#

  • 问题拓展:
    create_lod_tensor函数从一个numpy数组,列表或者已经存在的lod tensor中创建一个lod tensor。

通过一下几步实现:

1.检查length-based level of detail (LoD,长度为基准的细节层次),或称recursive_sequence_lengths(递归序列长度)的正确性
2.将recursive_sequence_lengths转化为offset-based LoD(偏移量为基准的LoD)
3.把提供的numpy数组,列表或者已经存在的lod tensor复制到CPU或GPU中(依据执行场所确定)
4.利用offset-based LoD来设置LoD

本文分享 CSDN - 飞桨PaddlePaddle。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

hibernate中使用序列生成主键

hibernate中使用序列生成主键

xml文件:

<id name="id" type="java.lang.Long">
              <column name="id" length="19">
                <comment></comment>
              </column>
              <generator class="sequence">
                  <param name="sequence">SEQ_JbpmTaskInherit_SEQUENCE</param>
              </generator>
   </id>

创建序列:

create sequence SEQ_JbpmTaskInherit_SEQUENCE

start with 1

increment by 1

nocycle

nocache;

 

Hibernate:如何使用注释指定自定义序列生成器的类名?

Hibernate:如何使用注释指定自定义序列生成器的类名?

我想使用注释指定以下hbm配置:

<id name="somePK" column="&quot;somePK&quot;" type="long">
            <generator/>
        </id>

我不确定如何使用

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_STORE")

我必须@javax.persistence.SequenceGenerator在每个实体类中指定吗?
我可以仅在@GeneratedValue注释下指定类名称吗?

java – 这个线程安全的字节序列生成器有什么问题?

java – 这个线程安全的字节序列生成器有什么问题?

我需要一个字节生成器,它将生成从Byte.MIN_VALUE到Byte.MAX_VALUE的值.当它达到MAX_VALUE时,它应该从MIN_VALUE重新开始.

我使用AtomicInteger编写了代码(见下文);但是,如果同时访问并且如果使用Thread.sleep()人为地减慢了代码,那么代码似乎没有正常运行(如果没有睡眠,它运行正常;但是,我怀疑它对于出现并发问题来说太快了).

代码(添加了一些调试代码):

public class ByteGenerator {

    private static final int INITIAL_VALUE = Byte.MIN_VALUE-1;

    private AtomicInteger counter = new AtomicInteger(INITIAL_VALUE);
    private AtomicInteger resetCounter = new AtomicInteger(0);

    private boolean isSlow = false;
    private long startTime;

    public byte nextValue() {
        int next = counter.incrementAndGet();
        //if (isSlow) slowDown(5);
        if (next > Byte.MAX_VALUE) {
            synchronized(counter) {
                int i = counter.get();
                //if value is still larger than max byte value,we reset it
                if (i > Byte.MAX_VALUE) {
                    counter.set(INITIAL_VALUE);
                    resetCounter.incrementAndGet();
                    if (isSlow) slowDownAndLog(10,"resetting");
                } else {
                    if (isSlow) slowDownAndLog(1,"missed");
                }
                next = counter.incrementAndGet();
            }
        }
        return (byte) next;
    }

    private void slowDown(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
        }
    }
    private void slowDownAndLog(long millis,String msg) {
        slowDown(millis);
        System.out.println(resetCounter + " " 
                           + (System.currentTimeMillis()-startTime) + " "
                           + Thread.currentThread().getName() + ": " + msg);
    }

    public void setSlow(boolean isSlow) {
        this.isSlow = isSlow;
    }
    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }

}

并且,测试:

public class ByteGeneratorTest {

    @Test
    public void testGenerate() throws Exception {
        ByteGenerator g = new ByteGenerator();
        for (int n = 0; n < 10; n++) {
            for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
                assertEquals(i,g.nextValue());
            }
        }
    }

    @Test
    public void testGenerateMultiThreaded() throws Exception {
        final ByteGenerator g = new ByteGenerator();
        g.setSlow(true);
        final AtomicInteger[] counters = new AtomicInteger[Byte.MAX_VALUE-Byte.MIN_VALUE+1];
        for (int i = 0; i < counters.length; i++) {
            counters[i] = new AtomicInteger(0);
        }
        Thread[] threads = new Thread[100];
        final CountDownLatch latch = new CountDownLatch(threads.length);
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new Runnable() {
                public void run() {
                    try {
                        for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
                            byte value = g.nextValue();
                            counters[value-Byte.MIN_VALUE].incrementAndGet();
                        }
                    } finally {
                        latch.countDown();
                    }
                }
            },"generator-client-" + i);
            threads[i].setDaemon(true);
        }
        g.setStartTime(System.currentTimeMillis());
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        latch.await();
        for (int i = 0; i < counters.length; i++) {
            System.out.println("value #" + (i+Byte.MIN_VALUE) + ": " + counters[i].get());
        }
        //print out the number of hits for each value
        for (int i = 0; i < counters.length; i++) {
            assertEquals("value #" + (i+Byte.MIN_VALUE),threads.length,counters[i].get());
        }
    }

}

在我的2核机器上的结果是值#-128得到146次点击(所有这些都应该得到100次点击,因为我们有100个线程).

如果有人有任何想法,这个代码有什么问题,我都是耳朵/眼睛.

更新:对于那些赶时间并且不想向下滚动的人来说,在Java中解决这个问题的正确(以及最短和最优雅)方式将是这样的:

public byte nextValue() {
   return (byte) counter.incrementAndGet();
}

谢谢,亨氏!

解决方法

您根据counter.get()的旧值决定incrementAndGet().在对计数器执行incrementAndGet()操作之前,计数器的值可以再次达到MAX_VALUE.
if (next > Byte.MAX_VALUE) {
    synchronized(counter) {
        int i = counter.get(); //here You make sure the the counter is not over the MAX_VALUE
        if (i > Byte.MAX_VALUE) {
            counter.set(INITIAL_VALUE);
            resetCounter.incrementAndGet();
            if (isSlow) slowDownAndLog(10,"resetting");
        } else {
            if (isSlow) slowDownAndLog(1,"missed"); //the counter can reach MAX_VALUE again if you wait here long enough
        }
        next = counter.incrementAndGet(); //here you increment on return the counter that can reach >MAX_VALUE in the meantime
    }
}

为了使其工作,必须确保不对陈旧信息做出决定.重置计数器或返回旧值.

public byte nextValue() {
    int next = counter.incrementAndGet();

    if (next > Byte.MAX_VALUE) {
        synchronized(counter) {
            next = counter.incrementAndGet();
            //if value is still larger than max byte value,we reset it
            if (next > Byte.MAX_VALUE) {
                counter.set(INITIAL_VALUE + 1);
                next = INITIAL_VALUE + 1;
                resetCounter.incrementAndGet();
                if (isSlow) slowDownAndLog(10,"resetting");
            } else {
                if (isSlow) slowDownAndLog(1,"missed");
            }
        }
    }

    return (byte) next;
}

今天的关于如何对非ID字段使用序列生成器?如何对非id字段使用序列生成器进行处理的分享已经结束,谢谢您的关注,如果想了解更多关于Fluid版本中如何使用序列数据?、hibernate中使用序列生成主键、Hibernate:如何使用注释指定自定义序列生成器的类名?、java – 这个线程安全的字节序列生成器有什么问题?的相关知识,请在本站进行查询。

本文标签: