значение автоинкремента в liferay - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 2 модуля, например, модуль 1 и модуль 2, модуль 1 использует liferay, а модуль 2 не использует liferay.

У меня есть база данных скажем myDatabase.

Оба модуля 1 имодуль 2 использует одну и ту же базу данных для операций чтения и записи.

модуль 1 использует построитель служб и в определенной таблице 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 в то время, однако он показывает Дублирующую запись '143' для ключа 'PRIMARY'.

Сценарий 2: когда модуль 2 вставляет две записи, и теперь, когда модуль 1 пытается вставить его сновавыдает такое же исключение для 144И при повторной операции вставки для 145 и с третьей попытки она вставляет для 146, поскольку сейчас это текущее значение автоинкремента.

Проблема в том, что оно (модуль 1 - построитель сервисов) не получает последнюю версиюавтоинкрементное значение.Как можно выбрать последнее значение auto_increment.

Вот структура в service.xml модуля 1:

<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>

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Кроме того, вы можете создавать PrimaryKeys самостоятельно, используя случайные UUID, например.В этом случае ваш столбец первичного ключа больше не будет столбцом Long, а столбцом Varchar.Но в этом случае необходимо перенести предыдущие идентификаторы.

В этом сценарии оба модуля могут быть четко разделены, поскольку они не зависят от увеличенного значения.

0 голосов
/ 01 июня 2018

Вы можете определить id-тип как личность.Если у вас есть столбец с автоинкрементным первичным ключом.Есть 4 разных типа идентификаторов.Обычно мы используем приращение.Но в вашем случае вы должны использовать личность.Надеюсь, это поможет.Спасибо.

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