具有枚举字段类型的Ebean模型的意外生成演化脚本

时间:2013-03-21 06:46:49

标签: java enums playframework ebean playframework-evolutions

我仍在使用Play Framework了解Ebean ORM。由Play!Framework生成的意外进化脚本有问题。我正在使用 Play!Framework 2.1.1 和JDK 1.7 update 5 64位。很抱歉,这个问题需要很长的代码段。

我有两个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)属性定义CourseType.value检查(0,1,2,3)。我怀疑evolution使用我的枚举的ORDINAL值来生成此检查。

  2. castillo_course_interest CREATE TABLE脚本中,它再次定义除castillo_courses以外的所有code字段。我希望脚本是定义course_code列,由@JoinColumn注释定义。这里还有另一个问题。它也没有生成主键约束的脚本,因为我在模型中定义了两个@Id

  3. 我感谢任何能够解释,提供建议或帮助我解决这个问题的人.. :)

    请问。

2 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:0)

  

对于问题1,我使用了来自@publiclass1的建议。


  

对于问题2,我了解复合主键。在CourseInterest模型上,我使用了复合主键,因为我希望它有2种类型的主键,一种是外键(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

所以,通过这些技术,我得到了我想要的进化脚本。 ;)