原标题:Spring认证中国教育管理中心-Spring Data Neo4j教程四(Spring中国教育管理中心)
6.3.3.一般建议
- 尝试坚持使用不可变对象 ——不可变对象很容易创建,因为实现对象只需调用其构造函数即可。此外,这可以防止您的域对象被允许客户端代码操纵对象状态的 setter 方法乱扔垃圾。如果您需要这些,最好将它们包保护起来,以便它们只能被有限数量的并置类型调用。仅构造函数实现比属性填充快 30%。
- 提供一个全参数的构造函数 ——即使你不能或不想将你的实体建模为不可变值,提供一个将实体的所有属性作为参数(包括可变属性)的构造函数仍然有价值,因为这允许对象映射以跳过属性填充以获得最佳性能。
- 使用工厂方法而不是重载的构造函数来避免@PersistenceConstructor - 使用最佳性能所需的全参数构造函数,我们通常希望公开更多特定于应用程序用例的构造函数,这些构造函数省略自动生成的标识符等内容。这是一种既定的模式,而不是使用静态工厂方法来公开这些全参数构造函数的变体。
- 确保遵守允许使用生成的实例化器和属性访问器类的约束
- 对于要生成的标识符,仍然使用 final 字段结合 wither 方法
- 使用 Lombok 避免样板代码 - 由于持久性操作通常需要一个构造函数来获取所有参数,因此它们的声明变成了对字段分配的样板参数的繁琐重复,使用 Lombok 可以最好地避免这种情况@AllArgsConstructor。
关于不可变映射的说明
尽管我们建议尽可能使用不可变映射和构造,但在映射方面存在一些限制。给定一个双向关系,其中A有一个构造函数引用B和B一个引用A,或者更复杂的场景。Spring Data Neo4j 无法解决这种先有后有的情况。在它的实例化过程中,A它迫切需要一个完全实例化的,B另一方面,它需要一个. SDN 通常允许这样的模型,但会抛出一个AMappingException如果从数据库返回的数据包含上述星座,则在运行时。在这种情况下,您无法预见返回的数据是什么样的,您更适合使用可变字段来处理关系。
6.3.4.Kotlin 支持
Spring Data 调整了 Kotlin 的细节以允许对象创建和变异。
Kotlin 对象创建
Kotlin 类支持实例化,默认情况下所有类都是不可变的,需要明确的属性声明来定义可变属性。考虑以下data类Person:
data class Person(val id: String, val name: String)
上面的类编译为具有显式构造函数的典型类。我们可以通过添加另一个构造函数来自定义这个类,并用注释@PersistenceConstructor来指示构造函数的偏好:
data class Person(var id: String, val name: String) {
@PersistenceConstructor
constructor(id: String) : this(id, "unknown")
}
Kotlin 通过在未提供参数时允许使用默认值来支持参数可选性。当 Spring Data 检测到具有参数默认值的构造函数时,如果数据存储不提供值(或简单地返回null),它将使这些参数不存在,因此 Kotlin 可以应用参数默认值。考虑以下应用参数默认值的类name
data class Person(var id: String, val name: String = "unknown")
每次name参数不是结果的一部分或其值为null时,name默认为unknown。
Kotlin 数据类的属性总体
在 Kotlin 中,默认情况下所有类都是不可变的,并且需要显式的属性声明来定义可变属性。考虑以下data类Person:
data class Person(val id: String, val name: Str