Встроенный класс 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