我仍在使用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
我对生成的演化脚本的期望是:
在castillo_courses
CREATE TABLE
脚本中,ck_castillo_courses_course_type
约束应根据(1,2,3,4)
属性定义CourseType.value
,不检查(0,1,2,3)
。我怀疑evolution使用我的枚举的ORDINAL
值来生成此检查。
在castillo_course_interest
CREATE TABLE
脚本中,它再次定义除castillo_courses
以外的所有code
字段。我希望脚本是仅定义course_code
列,由@JoinColumn
注释定义。这里还有另一个问题。它也没有生成主键约束的脚本,因为我在模型中定义了两个@Id
。
我感谢任何能够解释,提供建议或帮助我解决这个问题的人.. :)
请问。
答案 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
所以,通过这些技术,我得到了我想要的进化脚本。 ;)