liferay中的自动增量值
auto increment value in liferay
我有 2 个模块,比如模块 1 和模块 2,
模块 1 使用 liferay,模块 2 未使用 liferay。
我有一个数据库说 myDatabase。
模块 1 和模块 2 都使用相同的数据库进行读写操作。
模块 1 正在使用服务构建器并在特定的 table 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(使用服务生成器)插入记录时,它会抛出下面提到的异常。
> 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)
当时数据库的 auto_increment 为 144,但仍然显示 Duplicate entry '143' for key 'PRIMARY'.
场景 2:当模块 2 插入两条记录时,现在当模块 1 尝试再次插入它时,对 144 抛出相同的异常。再次插入 145 的操作,第三次尝试插入 146,因为它现在是当前的自动增量值。
问题是它(模块 1 - 服务构建器)没有获取最新的自动增量值。
它如何选择最新的 auto_increment 值 .
这是模块 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-type定义为身份。如果您有一个具有自动递增主键的列。有 4 种不同的 ID 类型。通常我们使用增量。但是在您的情况下,您必须使用身份。希望这会有所帮助。谢谢
<column name="id" type="Integer" primary="true" id-type="identity" />
此外,您还可以使用随机 UUID 自行创建主键。在这种情况下,您的主键列将不再是 Long 列,而是 Varchar 列。但是,在这种情况下需要迁移以前的 ID。
在这种情况下,两个模块可以清楚地分开,因为它们不依赖于增量值。
我遇到了同样的问题,我有 2 台服务器 运行 liferay dxp (7.0) 使用相同的数据库。
使用 Varun Arya 发布的解决方案,插入生成的 SQL 查询已更改。不是将定义的 id 传递给查询,而是传递 NULL。
我必须在该字段中添加“AUTO_INCREMENT”才能使其正常工作。
IDENTITY 是 Liferay 的关键字规范,MYSQL 无法识别。
此致。
我有 2 个模块,比如模块 1 和模块 2, 模块 1 使用 liferay,模块 2 未使用 liferay。
我有一个数据库说 myDatabase。
模块 1 和模块 2 都使用相同的数据库进行读写操作。
模块 1 正在使用服务构建器并在特定的 table 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(使用服务生成器)插入记录时,它会抛出下面提到的异常。
> 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)
当时数据库的 auto_increment 为 144,但仍然显示 Duplicate entry '143' for key 'PRIMARY'.
场景 2:当模块 2 插入两条记录时,现在当模块 1 尝试再次插入它时,对 144 抛出相同的异常。再次插入 145 的操作,第三次尝试插入 146,因为它现在是当前的自动增量值。
问题是它(模块 1 - 服务构建器)没有获取最新的自动增量值。 它如何选择最新的 auto_increment 值 .
这是模块 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-type定义为身份。如果您有一个具有自动递增主键的列。有 4 种不同的 ID 类型。通常我们使用增量。但是在您的情况下,您必须使用身份。希望这会有所帮助。谢谢
<column name="id" type="Integer" primary="true" id-type="identity" />
此外,您还可以使用随机 UUID 自行创建主键。在这种情况下,您的主键列将不再是 Long 列,而是 Varchar 列。但是,在这种情况下需要迁移以前的 ID。
在这种情况下,两个模块可以清楚地分开,因为它们不依赖于增量值。
我遇到了同样的问题,我有 2 台服务器 运行 liferay dxp (7.0) 使用相同的数据库。
使用 Varun Arya 发布的解决方案,插入生成的 SQL 查询已更改。不是将定义的 id 传递给查询,而是传递 NULL。 我必须在该字段中添加“AUTO_INCREMENT”才能使其正常工作。 IDENTITY 是 Liferay 的关键字规范,MYSQL 无法识别。
此致。