在本文中,我们将给您介绍关于如何对非ID字段使用序列生成器?的详细内容,并且为您解答如何对非id字段使用序列生成器进行处理的相关问题,此外,我们还将为您提供关于Fluid版本中如何使用序列数据?、hi
在本文中,我们将给您介绍关于如何对非ID字段使用序列生成器?的详细内容,并且为您解答如何对非id字段使用序列生成器进行处理的相关问题,此外,我们还将为您提供关于Fluid版本中如何使用序列数据?、hibernate中使用序列生成主键、Hibernate:如何使用注释指定自定义序列生成器的类名?、java – 这个线程安全的字节序列生成器有什么问题?的知识。
本文目录一览:- 如何对非ID字段使用序列生成器?(如何对非id字段使用序列生成器进行处理)
- Fluid版本中如何使用序列数据?
- hibernate中使用序列生成主键
- Hibernate:如何使用注释指定自定义序列生成器的类名?
- java – 这个线程安全的字节序列生成器有什么问题?
如何对非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
小编典典检查类中result
generate方法返回的值SequenceControlNumber
。
BTW在以下SO问题中检查此响应:hibernateJPA序列(非ID)
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中使用序列生成主键
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:如何使用注释指定自定义序列生成器的类名?
我想使用注释指定以下hbm配置:
<id name="somePK" column=""somePK"" type="long">
<generator/>
</id>
我不确定如何使用
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_STORE")
我必须@javax.persistence.SequenceGenerator
在每个实体类中指定吗?
我可以仅在@GeneratedValue
注释下指定类名称吗?
java – 这个线程安全的字节序列生成器有什么问题?
我使用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(); }
谢谢,亨氏!
解决方法
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 – 这个线程安全的字节序列生成器有什么问题?的相关知识,请在本站进行查询。
本文标签: