liferay中的自动增量值

liferay中的自动增量值,liferay,liferay-service-builder,Liferay,Liferay Service Builder,我有两个模块,比如模块1和模块2, 模块1正在使用liferay,模块2未使用liferay 我有一个数据库说我的数据库 模块1和模块2都使用相同的数据库进行读写操作 模块1正在使用service builder并在特定的表XYZ上插入一个值,它使用下面提到的代码 XYZ = XYZLocalServiceUtil.createXYZ(0); XYZ.setX(x); XYZ.setY(y); XYZ.setZ(z); XYZ = XYZLocalServiceUtil.addXYZ(XYZ);

我有两个模块,比如模块1和模块2, 模块1正在使用liferay,模块2未使用liferay

我有一个数据库说我的数据库

模块1和模块2都使用相同的数据库进行读写操作

模块1正在使用service builder并在特定的表XYZ上插入一个值,它使用下面提到的代码

XYZ = XYZLocalServiceUtil.createXYZ(0);
XYZ.setX(x);
XYZ.setY(y);
XYZ.setZ(z);
XYZ = XYZLocalServiceUtil.addXYZ(XYZ);
模块2正在使用查询:

插入XYZ(x,y,z)值(x,y,z)

现在,当模块2首先插入一条记录时,问题就出现了

在模块2插入之后,当模块1(使用service builder)插入一条记录时,它抛出下面提到的异常

> 06:04:02,824 ERROR [http-bio-8443-exec-38][JDBCExceptionReporter:82]
> Duplicate entry '143' for key 'PRIMARY' 06:04:02,847 ERROR
> [http-bio-8443-exec-38][ClpSerializer:3279]
> java.lang.ClassNotFoundException:
> org.hibernate.exception.ConstraintViolationException
> java.lang.ClassNotFoundException:
> org.hibernate.exception.ConstraintViolationException  at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
>   at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
>   at java.lang.Class.forName0(Native Method)  at
> java.lang.Class.forName(Class.java:278)   at
> com.liferay.portal.kernel.util.ClassResolverUtil.resolve(ClassResolverUtil.java:29)
>   at
> com.liferay.portal.kernel.util.ClassLoaderObjectInputStream.resolveClass(ClassLoaderObjectInputStream.java:43)
>   at
> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1861)
>   at
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1744)
>   at
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2033)
>   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1566)
>   at
> java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2278)
>   at
> java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:556)
>   at java.lang.Throwable.readObject(Throwable.java:914)   at
> sun.reflect.GeneratedMethodAccessor1940.invoke(Unknown Source)    at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.lang.reflect.Method.invoke(Method.java:606)     at
> java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160)
>   at
> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169)
>   at
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
>   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1566)
>   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
>   at
> com.myproject.ClpSerializer.translateThrowable(ClpSerializer.java:3265)
>   at com.myproject.XYZLocalServiceClp.addXYZ(XYZLocalServiceClp.java:1)
>   at
> com.myproject.XYZLocalServiceUtil.addXYZ(XYZLocalServiceUtil.java:5)
此时数据库的自动增量为144,但仍显示键“PRIMARY”的重复条目“143”

场景2:当模块2插入两条记录时,而现在当模块1尝试再次插入时,会对144抛出相同的异常。再次对145执行插入操作,第三次尝试时插入146,因为它是当前的自动增量值

问题在于(模块1-服务生成器)没有拾取最新的自动增量值。 它如何拾取最新的自动增量值

以下是模块1的service.xml中的结构:

<entity name="XYZ" local-service="true" remote-service="false" cache-enabled="false" >
        <column name="xyzId" type="long" primary="true"
            id-type="increment"></column>
        <column name="x" type="long"></column>
        <column name="y" type="long"></column>
        <column name="z" type="long"></column>
</entity>

您可以将id类型定义为标识。如果有一列具有自动递增主键。有4种不同的id类型。通常我们使用增量。但在你的情况下,你必须使用身份。希望这会有所帮助。谢谢

<column name="id" type="Integer" primary="true" id-type="identity" />

此外,例如,您可以使用随机UUID自己创建PrimaryKey。在这种情况下,主键列不再是长列,而是Varchar列。但是,在这种情况下,需要迁移以前的ID


在这种情况下,两个模块可以清楚地分开,因为它们不依赖于递增的值。

我遇到了同样的问题,我有两台服务器使用相同的数据库运行liferay dxp(7.0)

使用Varun Arya发布的解决方案,insert生成的SQL查询被更改。传递NULL而不是向查询传递定义的id。 我必须在字段中添加“AUTO_INCREMENT”才能让它工作。 IDENTITY是Liferay的关键字说明符,MYSQL无法识别


问候。

答案已更新。请让我知道是否需要任何示例。是的,它工作了,但我不明白它是如何工作的,您能解释一下这种方法吗?在这个实现中,为这个实体生成的create table SQL将创建一个标识列,每当发生插入时,该列会自动生成主键。此实现仅受DB2、MySQL和MS SQL Server支持。在您的示例中,您可以在xyzmodellimpl.java中检查公共静态最终字符串表_SQL_CREATE,您将看到带有主键的IDENTITY关键字,如xyzId
LONG not null primary key IDENTITY