Opened a PR for this issue (CAY-2889). FWIW, Jira wouldn't allow me to
assign the issue to myself.

On Fri, May 2, 2025 at 2:06 PM Michael Gentry <blackn...@gmail.com> wrote:

> Hi Robert!
>
> You are correct that it should've called the methods in your class. I'll
> open a JIRA for the MySQLPkGenerator to remove the 'super` calls, but for
> now, you'll have to manually fix it in your subclass.
>
> Thanks for bringing this to our attention,
> mrg
>
>
> On Fri, May 2, 2025 at 10:29 AM Robert A. Decker
> <dec...@robdecker.com.invalid> wrote:
>
>> 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