2017-08-31 24 views
6

tôi có ba lớp Kotlin của đại diện các đơn vị Hibernate:Overriding Kotlin của dẫn đến hai JPA @ id

@MappedSuperclass 
abstract class Parent { 
    @Id @GeneratedValue @Column(nullable=false) 
    var id: Long? = null 
} 

@Entity 
class Child1 {} 

@Entity 
class Child2 { 
    @Id @GeneratedValue @Column(nullable=false) 
    override var id: Long? = null 
     set(value) { 
      super.id = value 
      doSomething() 
     } 
} 

Lưu ý tôi cần phải ghi đè lên các setter cho id gọi doSomething sau đó. Đó là cách tôi đã làm id trong Java trước đây.

Nó xây dựng một cách chính xác, nhưng Hibernate không thích nó:

A foreign key refering Child2 from ... has the wrong number of column. Should be 2. 

Từ một số lỗi khác mà tôi nghi ngờ overriden id không overriden một cách chính xác và Hibernate thấy id cột hai lần - từ ParentChild2.

+0

Bạn có thực sự cần thêm chú thích vào phiên bản 'id' được ghi đè không? (Đã không cố gắng bản thân mình) – Xvolks

+0

Tôi đã cố gắng đó là tốt, nhưng sau đó nó dẫn đến: 'Lặp đi lặp lại cột trong ánh xạ cho thực thể: Child2 cột: id (nên được ánh xạ với insert =" false "update =" false ")' –

Trả lời

2

tôi vô tình tìm thấy một giải pháp:

override var id: Long? 
    get() = super.id 
    set(value) { 
     super.id = value 
     doSomething() 
    } 

Bí quyết là:

  1. không gán một giá trị cho các lĩnh vực
  2. tạo ra một getter liên kết đến các super

Bằng cách này Kotlin sẽ không tạo ra một lĩnh vực mới trên thực thể và nó sẽ chỉ ghi đè lên getter/setter.

Các vấn đề liên quan