0

私はまだPlayFrameworkを使ったEbeanORMについて学んでいます。Play!Frameworkによって生成された予期しない進化スクリプトに問題があります。Play!Framework2.1.1とJDK1.7 update564ビットを使用しています。申し訳ありませんが、この質問の長いコードスニペットについてです。

次のような2つのEbeanモデルがあります。

Course.java

package models;

import play.data.validation.Constraints;
import play.db.ebean.Model;
import javax.persistence.*;

@Entity
@Table(name = "castillo_courses")
public class Course extends Model {
    public enum CourseType {
        COMPULSORY(1), BASIC_INTEREST(2), ADVANCED_INTEREST(3), THESIS(4);

        private int value;

        CourseType(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

    @Id
    private String code;
    @Constraints.Required
    private String course_name;
    @Constraints.Required
    private String credits;
    @Constraints.Required
    private CourseType course_type;

    // Ebean finder and Other getter and setter method
    ......
}

CourseInterest.java

package models;

import play.data.validation.Constraints;
import play.db.ebean.Model;

import javax.persistence.*;

@Entity
@Table(name = "castillo_course_interest")
public class CourseInterest extends Model {
    public enum InterestType {
        ARCHITECTURAL_INFRA(1), SOFTWARE_TECH(2), INFORMATION_PROCESSING(3), ENTERPRISE_SYSTEM(4), COMP_INTELLIGENCE(5);
        private int value;

        InterestType(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

    @Id
    @ManyToOne
    @JoinColumn(name = "course_code", referencedColumnName = "code")
    private Course course;
    @Id
    @Constraints.Required
    private InterestType interest_type;

    // Ebean finder and Other getter and setter method
    ......
}

これは、上記のモデルから生成された進化スクリプトです。

# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups

create table castillo_courses (
  code                      varchar(255) not null,
  course_name               varchar(255),
  credits                   varchar(255),
  course_type               integer,
  constraint ck_castillo_courses_course_type check (course_type in (0,1,2,3)),
  constraint pk_castillo_courses primary key (code))
;

create table castillo_course_interest (
  course_name               varchar(255),
  credits                   varchar(255),
  course_type               integer,
  interest_type             integer not null,
  constraint ck_castillo_course_interest_course_type check (course_type in (0,1,2,3)),
  constraint ck_castillo_course_interest_interest_type check (interest_type in (0,1,2,3,4)))
;

create sequence castillo_courses_seq;

create sequence castillo_course_interest_seq;

# ..... !DOWNS code not shown

生成された進化スクリプトで私が期待したのは次のとおりです。

  1. castillo_courses CREATE TABLEスクリプトでは、制約ck_castillo_courses_course_typeは、チェックインするのではなく、属性で(1,2,3,4)定義されたとおりにチェックインする必要があります。列挙型の値を使用して、evolutionがこのチェックを生成したと思われます。CourseType.value(0,1,2,3)ORDINAL

  2. castillo_course_interest CREATE TABLEスクリプトでは、を除くすべてのフィールドを再度定義しcastillo_coursesますcode。スクリプトは、アノテーションで定義された列を定義するだけだと思います。ここに別の問題があります。モデルで定義された2つを定義したため、主キー制約を生成するスクリプトもありません。course_code@JoinColumn@Id

この問題について説明したり、アドバイスを与えたり、助けてくれたりする人に感謝します。:)

よろしくお願いします。

4

2 に答える 2

1

ユーザー@EnumValue( "1")

サンプル。

すべての値が整数として解析可能である場合、Ebeanはそれらを永続化し、文字列ではなく整数としてフェッチします。

public enum InterestType {
       @EnumValue("1")
        ARCHITECTURAL_INFRA(1),
 @EnumValue("2")
SOFTWARE_TECH(2),
@EnumValue("3")
INFORMATION_PROCESSING(3),
 @EnumValue("4")
ENTERPRISE_SYSTEM(4),
@EnumValue("5")
 COMP_INTELLIGENCE(5);
        private int value;
        InterestType(int value) {
            this.value = value;
        }
        public int getValue() {
            return value;
        }
    }
于 2013-05-08T02:19:16.337 に答える
0

質問番号1には、@publiclass1からの提案を使用しました。


質問2では、複合主キーについて学びます。モデルでは、 2CourseInterest種類の主キーが必要なため、複合主キーを使用しました。1つは外部キー(course_code)で、もう1つは共通フィールド(interest_type)です。なので、次のようにやってみました。

これはCourseInterestモデルのサンプルです:

@EmbeddedId // using compound primarykey
public CourseInterestPK key;

@MapsId("courseCode") // map embedded key
@ManyToOne
@JoinColumn(name = "course_code", referencedColumnName = "code")
public Course course;

@MapsId("interestType") // map embedded key
@Constraints.Required
public InterestType interest_type;

これはCourseInterestPK(複合主キー定義)クラスのサンプルです。

@Embeddable
public class CourseInterest15541120PK {
     @Column(name = "course_code")
     public String courseCode;

     @Column(name = "interest_type")
     public CourseInterest.InterestType interestType;

     @Override
     public boolean equals(Object obj) {
         ... // MUST to override this method
     }

     @Override
     public int hashCode() {
         ... // MUST to override this method  
     }
}

したがって、これらの手法を使用して、必要な進化スクリプトを取得します。;)

于 2013-05-08T07:54:08.187 に答える