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 } }