2016-06-09 3 views
5

대부분의 코 틀린 JPA 예제 코드는이JPA/Hibernate가있는 Kotlin :`open`없이 lazy-loading이 없습니까?

class Person(val name: String, val age: Int) { /* ... */ } 

또는 지금

data class Person(val name: String="", val age: Int=0) { /* ... */ } 

Hibernate User Guide처럼 보이는, 그리고 나는 그들이 일반적으로 확장, 그렇지 않으면 프록시를 만들거나하려는 다른 여러으로 ORMs, 상태 생각 모델 클래스이지만 Kotlin에서 클래스를 명시 적으로 정의해야만합니다. open. 현재 데이터 클래스에서는 이것이 불가능하며 내 경험에 비추어 볼 때 Kotlin에 JPA 엔티티를 작성할 때 대부분의 사람들이 생각하지 않는다고 가정합니다.

그래서, 그것은

open class Person(val name: String, val age: Int) { /* ... */ } 

을 할 충분하다, (이 유래 모든 후) 내 질문에 와서 또는 우리가 실제로

open class Person(open val name: String, open val age: Int) { /* ... */ } 

가 불필요하게 방해하지 않도록해야 할 것입니다 ORM은 제대로 일하고 있습니까?
정말 위험한 경우 IntelliJ IDEA에 경고를 추가해야합니다. 즉, 클래스에 @Entity 주석이있는 경우 open으로 정의해야합니다.

+0

"harmful"이라는 단어가 여기에 어떻게 적용되는지 모르겠습니다. 그 사용법을 분명히하거나 중요하지 않은 경우 질문에서 삭제할 수 있습니까? – voddan

+0

적어도 Hibernate는 최종 클래스이거나 최종 접근 자 메소드를 가지고 있고 JPA에 대한 데이터 클래스를 사용하는 것이 종종 좋은 일처럼 생겼지 만 실제로 성능을 해칠 수는 없다는 사실은 정의에 의해 최종적이기 때문에 (적어도 그 순간은 변할 수 있다고 들었음). 제목은 매우 보편적으로 알려져 있고 예방해야한다고 생각했기 때문에 클릭 버디입니다. Kotlin에 포팅 된 애플리케이션이 Java 대응 제품보다 성능이 떨어지고 Kotlin을 비난하는 사용자 :/ – johnp

+0

질문을 바꾸어 주셔서 감사합니다! – voddan

답변

6

튜토리얼은 당신이 지정 제공 :

엔티티 클래스는 공용 또는 인수가없는 생성자 ... 인터페이스가 법인으로 지정되지 않을 수 있습니다 보호를해야합니다 ... 엔티티 클래스는 최종이 아니어야합니다 . 엔티티 클래스의 메소드 나 영구 인스턴스 변수는 final이 될 수 없습니다.

Kotlin 클래스는 setters/getters 용 JavaBeans 규칙을 따릅니다. 생성자 매개 변수에 대해

open class Person(open val name: String = "", 
        open val age: Int = 0) 

기본값은 코 틀린은 추가 빈을 생성 할 수 있습니다 : 당신의 ORM은 상기와 요구 사항이있는 경우

, 당신은 실제로 클래스와 그 방법에 open을 지정해야 건설자. 또는 당신은 차 생성자로 제공 할 수 open val 개인 최종 필드와 오픈 게터를 생성

open class Person(open val name: String, open val age: Int) { 
    constructor() : this("", 0) 
} 

하는 것으로. 그 수가 충분하지 않으면 @JvmField open val name과 같은 특수 효과를 사용하십시오.

당신이 사용하는 ORM은 Kotlin 코드와의 마찰이 있습니다. 왜냐하면 그들이 사용하는 의심스러운 디자인 패턴 때문입니다.

좋은 옵션은 Kotlin 특정 ORM을 사용하는 것입니다. 예를 들어 Exposed은 JetBrain에서 지원되며 일부 제품에 사용됩니다. 또 다른 옵션은 Ebean입니다. 공식적으로 Kotlin을 지원합니다 (감사합니다 @ johnp)

+1

답변 해 주셔서 감사합니다! 이상하게 들리는 것들 중 하나는 최종 클래스가 Hibernate에 게으른로드가 될 수 없다는 것이 었습니다. 그리고 고려하지 않으면 성능을 심각하게 손상시킬 수 있다고 상상했습니다. 몇 주 전, 분명히 Kotlin을 언급하고 Hibernate보다 낮은 진입 장벽을 가지고 있기 때문에 개인적으로 [Ebean] (https://ebean-orm.github.io/)으로 전환했지만, 아직 노출되지 않았다는 것을 들어 보지 못했습니다. 그것을 확실히 볼 것입니다. – johnp

+0

게으른 로딩은 getter가 처음으로 호출 될 때만 Hibernate가 데이터를로드해야 함을 의미합니다. 그러나 getter는 프로그래머가 이미 구현했습니다 (간단한 필드 읽기와 같이)! 따라서 Hibernate는 호출시 JDBC를 폴링하도록 해당 메소드의 기능을 변경해야합니다. 컴파일 단계에서 바이트 코드를 수정하거나 동적으로 클래스를 확장하고 setter를 재정 의하여 메소드를 변경할 수 있습니다. –

+0

Kotlin 특정 ORM을 고려하고 싶다면 https://github.com/mvysny/vokormorm을 선택하는 것이 좋습니다. 여전히 POJO를 사용합니다. JSR303 주석으로 주석을 달고 웹 양식으로 전달할 수 있습니다. Sql2o를 사용합니다. 유일한 목표 언어 인 Kotlin에 초점을 맞 춥니 다. 면책 조항 : 저는 저자입니다. –