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