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