簡體   English   中英

使用 ManyToOne 注解創建實體

[英]Creating an entity with a ManyToOne annotation

我正在創建一個與另一個具有多對一關系的實體,它是多個客戶可以屬於一家公司。 現在我的客戶實體定義如下:

@Entity
@Table(name = "Customers")
data class Customer(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var customerId: Long? = null,
    var firstName: String,
    var lastName: String,
    var gender: String,
    @Column(insertable = false, updatable = false)
    var companyId: Long,
    @ManyToOne(targetEntity = Company::class, fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId", referencedColumnName = "companyId")
    var company: Company? = null,
    var profilePicture: String,
    var email: String,
    var phone: String,
    var birthDay: String,
    var bio: String,
    var notifyByPhone: Boolean,
    var notifyByEmail: Boolean,
    var notifyBySms: Boolean,
    @UpdateTimestamp
    var updatedAt: LocalDateTime,
    @CreationTimestamp
    var createdAt: LocalDateTime
)

我使用 CustomerResource 中的以下函數作為端點來持久化客戶:

    @Transactional
    @POST
    fun post(@Valid entity: Customer): Response = try {
        repository.persist(entity)
        created(entity)
    } catch (exc: Exception) {
        serverError(exc)
    }

使用 Postman,我使用以下 JSON 對象向端點發出請求:

{
    "firstName": "Ricardo",
    "lastName": "de Vries",
    "gender": "male",
    "companyId": "200",
    "profilePicture": "test",
    "email": "mail@gmail.com",
    "phone": "0612536263",
    "birthDay": "28-12-1995",
    "bio": "Nothing",
    "notifyByPhone": true,
    "notifyByEmail": true,
    "notifyBySms": true
}

我有一個名為“公司”的屬性,它根據 companyId 映射到用戶所屬的公司。 我有一個單獨的 companyId 字段,它被映射到數據庫中的 companyId 字段。

當我想創建一個新客戶時,我在請求中包含了 companyId。 這成功了,並且正在成功創建客戶。

現在,當我嘗試獲取該特定客戶時,我得到以下信息

error: "org.hibernate.PropertyAccessException: Null value was assigned to a property [class org.acme.domains.core.models.entities.Customer.companyId] of primitive type setter of org.acme.domains.core.models.entities.Customer.companyId".

我真的不明白為什么會發生這個錯誤。 我認為,每當我獲取特定客戶時,屬於客戶的公司會在之后添加。

有人知道如何以這種方式添加實體嗎?

您是否生成了正確的 getter 和 setter? 似乎第一個請求未能正確設置字段。 我建議您在創建客戶的控制器上放置一個斷點,並檢查該字段是否按應有的方式設置。 也許您以錯誤的格式傳遞數據等。我不能從這些信息中說出來,但您應該調試它。

您還可以在您的字段上放置@NotNull 驗證,以查看它是否在對象創建中設置失敗。

您已將companyId映射為不可插入且不可更新,因此它不會出現在查詢中。

嘗試將其更改為:

@Column(insertable = true, updatable = true)
Long companyId

我認為發生了什么,是 Hibernate ORM 正在使用除此之外的所有其他值創建插入查詢。 我建議啟用日志來檢查。 您可以通過設置在配置中執行此操作:

hibernate.show_sql = true
hibernate.format_sql = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM