I'll try that next. It seemed logical to be able to just override those methods 
in a subclass. But next, I'll copy/refactor the base class. I didn't look at 
the cayenne source code - was hoping to avoid that.

Rob

> On 2 May 2025, at 06:49, Michael Gentry <blackn...@gmail.com> wrote:
> 
> Hi Robert,
> 
> I'm assuming you copied MySQLPkGenerator.java to a new PK Generator class
> and made changes.
> 
> MySQLPkGenerator::getLongPrimaryKey calls super.pkSelectString(entityName)
> and super.pkUpdateString(entityName), which are located in JdbcPkGenerator.
> If you didn't remove the 'super' calls in your new PK Generator class, it
> won't call your new methods. It'll use the ones in JdbcPkGenerator, so
> please check that.
> 
> Thanks,
> mrg
> 
> 
> On Thu, May 1, 2025 at 11:42 PM Robert A. Decker
> <dec...@robdecker.com.invalid> wrote:
> 
>> thanks for getting me on the right track.
>> 
>> I've confirmed that my custom pk generator is working because I overrode
>> the method:
>> @Override
>> protected long getLongPrimaryKey(Statement statement, String entityName)
>> throws SQLException {
>> return super.getLongPrimaryKey(statement, entityName);
>> }
>> 
>> and I've confirmed in the debugger that that particular method is being
>> called in my custom pk generator when i create a new entity.
>> 
>> However, the following two methods in my custom pk generator aren't being
>> called at all:
>> @Override
>> protected String pkUpdateString(String entName) {
>> return "update EO_PK_TABLE SET PK = PK+1 where NAME = '" + entName + "'";
>> }
>> 
>> @Override
>> protected String pkSelectString(String entName) {
>> return "SELECT PK FROM eo_pk_table WHERE NAME = '" + entName + "'";
>> }
>> 
>> 
>> I think I can probably do everything I need to do in getLongPrimaryKey if
>> I need to, but it would be nice to use those two sql string methods.
>> 
>> I'll work on it a bit more this weekend.
>> 
>> Rob
>> 
>> 
>>> On 1 May 2025, at 02:42, Nikita Timofeev <ntimof...@objectstyle.com>
>> wrote:
>>> 
>>> Hi Robert,
>>> 
>>> There's no configuration for that, but you could define your own
>>> PkGenerator easily. Here's how to do it if you are using MySQL:
>>> 
>>> ServerModule.contributePkGenerators(binder)
>>>       .put(MySQLAdapter.class.getName(), MyPkGenerator.class)
>>> 
>>> And in the custom PK generator you'll need to redefine all methods with
>> the
>>> table name hardcoded (and you need to use), something like this:
>>> 
>>> public class MyPkGenerator extends MySQLPkGenerator {
>>>   ...
>>>   @Override
>>>   protected String pkSelectString(String entName) {
>>>       return "SELECT NEXT_ID FROM eo_pk_table WHERE TABLE_NAME = '" +
>>> entName + '\'';
>>>   }
>>>   ...
>>> }
>>> 
>>> Also judging by the table name you are converting from the WebObjects,
>> and
>>> if you'll need to keep Cayenne and WebObjects together you'll probably
>> need
>>> to sync Pk generation logic, not only the table name.
>>> 
>>> As for the Modeler, I don't think there's a simple way to do this. But if
>>> you are trying to use Modeler as an SQL generator, it's not generally
>>> recommended, it's primarily for dev purposes only.
>>> 
>>> On Thu, May 1, 2025 at 12:29 AM Robert A. Decker
>>> <dec...@robdecker.com.invalid> wrote:
>>> 
>>>> I'm trying to set the name of the auto_pk_support table to be
>> eo_pk_table
>>>> instead.
>>>> 
>>>> Is it possible to do this in code, similar to below with the
>>>> addModule/ServerModule section (which doesn't work because the key isn't
>>>> correct). I don't see anything I can use here:
>>>> 
>>>> 
>> https://cayenne.apache.org/docs/4.1/cayenne-guide/#appendix-a-configuration-properties
>>>> 
>>>> Also, is it possible to do in the modeller as well?
>>>> 
>>>> thanks,
>>>> Rob
>>>> 
>>>> 
>>>> cayenneRuntime = ServerRuntime.builder()
>>>>       .addConfig("cayenne-project.xml")
>>>>       .addModule(binder ->
>>>>               ServerModule.contributeProperties(binder)
>>>>                       .put("cayenne.PkGenerator.GeneratedKeyTableName",
>>>> "eo_pk_table"))
>>>>       .dataSource(DataSourceBuilder
>>>>               .url("jdbc:mysql://
>>>> 127.0.0.1:3306/sms?useSSL=false&serverTimezone=UTC")
>>>>               .driver("com.mysql.cj.jdbc.Driver")
>>>>               .userName("sms")
>>>>               .password("").build())
>>>>               .build();
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> --
>>> Best regards,
>>> Nikita Timofeev
>> 
>> 

Reply via email to