Kotlin JPA封装OneToMany
我正在使用Kotlin的JPA,并试图封装一个OneToMany关系的问题。 这是我可以很容易地在Java中实现,但由于Kotlin只有属性和类中没有字段有一些问题。
我有一个订单,一个订单有一个到多个订单项。 Order对象有一个LineItem的MutableList,但是get方法不应该返回一个可变列表,或者调用者可能修改的任何东西,因为这会破坏封装。 订单类应负责管理订单项的收集,并确保满足所有业务规则/验证。
这是我到目前为止的代码。 基本上我使用了一个支持属性,它是Order类将会改变的MutableList,然后是一个返回Iterable的transient属性, Collections.unmodifiableList(_lineItems)
确保即使调用者获取列表,并将其转换为MutableList他们将无法修改它。
有没有更好的方法来执行封装和完整性。 也许我只是在设计和方法上过于防守。 理想情况下,没有人应该使用getter来获取和修改列表,但嘿它发生。
import java.util.* import javax.persistence.* @Entity @Table(name = "order") open class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long? = null @Column(name = "first_name") lateinit var firstName: String @Column(name = "last_name") lateinit var lastName: String @OneToMany(cascade = arrayOf(CascadeType.ALL), fetch = FetchType.LAZY, mappedBy = "order") private val _lineItems: MutableList<LineItem> = ArrayList() val lineItems: Iterable<LineItem> @Transient get() = Collections.unmodifiableList(_lineItems) protected constructor() constructor(firstName: String, lastName: String) { this.firstName = firstName this.lastName = lastName } fun addLineItem(newItem: LineItem) { // do some validation and ensure all business rules are met here this._lineItems.add(newItem) } } @Entity @Table(name = "line_item") open class LineItem { @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long? = null @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "order_id", referencedColumnName = "id") lateinit var order: Order private set // whatever properties might be here protected constructor() constructor(order: Order) { this.order = order } }
- 扩展Kotlin数据类以便与JPA一起使用?
- Spring Data JPA + Guice错误:使用@EnableTransactionManagement注解时,没有类型的主要bean定义
- 与JPA Kotlin:默认构造函数地狱
- 使用JPA + Kotlin收集映射错误
- Kotlin脚本无法从jar中访问META-INF资源(persistence.xml)
- Kotlin使用SpringData Jpa定制存储库
- Kotlin与JPA / Hibernate:没有“开放”没有懒加载?
- 如何在hibernate-validator中设置一个可选的/可空的属性?
- 如何使用Spring Data JPA方法在Kotlin的try-with-resources块中返回Stream?