我有六点二。
我有一个使用MySql数据库的portlet。
我有一张persons桌
Id | Name | InfoId是自动增量的,因此在service.xml中有:
<column name="Id" type="long" primary="true" id-type="increment" />我有一台开发机器。mysql表persons中已有100行可用。我通过一个sql查询在表persons中输入了信息,并且使用了从300到600之间的id。我使用了Liferay后端工具来更新数据库缓存。当我使用应用程序(portlet)输入新行时,id为601。这是正确的。
我有一台生产机器,除了清空数据库缓存之外,我还执行了相同的操作,因为出于某种原因,我无法这样做。
当我插入一个新行时,带有portlet的id是101,而不是601。
当我插入一个新行时,我什么时候会出现** id ** 199?
我能做些什么来解决这个问题?
发布于 2019-01-21 18:03:24
如果您看到“数百”上的ids,您可能只看到Liferay实体的默认增量值:
# Set the number of increments between database updates to the Counter table.
# this value to a higher number for better performance.
# Defaults:
counter.increment=100您可以通过创建101个对象(其中对象#101 wou获得700个id)或关闭用于创建#101对象并重新启动的服务器,然后创建一个新对象来测试此行为: 100的粒度意味着将分配下一个100个id,下一个将选择#700。
当我插入一个新行时,我什么时候会出现** id ** 199?
很容易发现..。
我能做些什么来解决这个问题?
验证是否存在问题。也许没有必要解决任何问题
我有一台开发机器。mysql表persons中已经有100行可用。我通过sql查询在表persons中输入了信息,并且使用了从300到600开始的id。
如果您不依赖于自动id构造,那么这样做是一个非常糟糕的主意。Liferay的Service不能依赖数据库中的id生成,因为每个数据库在这方面的行为略有不同。
Liferay的id生成--当它遵循我前面描述的机制--是通过CounterLocalService完成的。您可以调用此服务来提前实体的Ids (使用实体的类名作为密钥),以防您对数据库进行手动操作。
您不应该直接更改数据库上的任何Liferay实体。如果您有自己的servicebuilder生成的实体,您可能有一个要点,但我的建议是选择一种编写/访问数据的方法并坚持使用它。
https://stackoverflow.com/questions/54286215
复制相似问题