Встроенный класс Kotlin для свойств с аннотацией @Id

В моей бизнес-логике мне приходится иметь дело с множеством идентификаторов сущностей, все из которых имеют тип String, что может вызвать путаницу, особенно когда вы передаете пару из них в качестве параметров метода. Поэтому я подумал о том, чтобы ввести небольшую безопасность типов с помощью встроенных классов. Я знаю, что встроенные классы все еще помечены как экспериментальные в v1.3. Тем не менее, кто-нибудь когда-либо пытался использовать встроенный класс в качестве свойства @Id в контексте сопоставления БД, в моем случае это MongoDB с данными Spring.

@Entity
class User {
   @Id
   var id: UserId
}

с участием

inline class UserId(val id: String)

Я предполагаю, что распаковки базового свойства нет, поэтому _id окажется объектом в БД? А как насчет интерфейсов CrudRepository Spring? Это кажется компилируемым, но будет ли он работать в конечном итоге:

interface UserRepository : CrudRepository<User, UserId>

Вероятно, используя AttributeConverterпреобразование встроенного класса в примитив может помочь. Есть ли опыт с этим?

3 ответа

В качестве обновления ответа @JuergenZimmermann это поддерживается в Spring Data Commons, начиная с версии 3.2 (которая в настоящее время является предварительной версией):

https://github.com/spring-projects/spring-data-commons/releases/tag/3.2.0-M1

Тогда код, написанный ОП, должен работать так, как задано. Более подробное обсуждение см. здесь: https://github.com/spring-projects/spring-data-commons/pull/2866 .

Встроенные классы приводят к совершенно новым типам, а не только к типизированному псевдониму. Даже если наша база кода знает, что это за новый тип, MongoDB не подходит? Таким образом, вы не можете сохранить встроенный класс непосредственно в соответствующие поля примитивного типа.

Есть неразрешенный билет для Spring Data Commons: https://github.com/spring-projects/spring-data-commons/issues/1947

Другие вопросы по тегам