I forgot to mention.... when it calls getLongPrimaryKey it throws the exception: SQLSyntaxErrorExceptio: Table 'sms.auto_pk_support' doesn't exist
If it's meant to call the other overridden sql methods after that then I won't know because the exception is thrown first. Looking at the docs: JdbcPkGenerator.longPkFromDatabase(DataNode node, DbEntity entity) doc says: "Subclasses that implement different primary key generation solutions should override this method, not "generatePkForDbEntity". But that method doesn't actually exist... Rob > On 1 May 2025, at 22:41, 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 >