Java 玩框架数据库继承
请注意:我是新来玩框架的 信息: 我已经花了几个小时寻找关于使用Play Framework继承的教程或解释 然而,每个例子似乎都忽略了整个例子,这造成了混乱,因此提出这个问题的原因 作为记录,我使用的是MariaDB(aka~MySQL) 研究与文档:Java 玩框架数据库继承,java,mysql,inheritance,playframework,playframework-2.0,Java,Mysql,Inheritance,Playframework,Playframework 2.0,请注意:我是新来玩框架的 信息: 我已经花了几个小时寻找关于使用Play Framework继承的教程或解释 然而,每个例子似乎都忽略了整个例子,这造成了混乱,因此提出这个问题的原因 作为记录,我使用的是MariaDB(aka~MySQL) 研究与文档: 文档-播放:不是很有帮助 文档-Java:,缺少完整的示例 Stackoverflow:几个问题,以及 博客:缺乏完整的例子,尽管很有见地 搜索,对于在PlayFramework中设置eBean非常有用 然而,我可能完全被误解了,但是示例提
- 文档-播放:不是很有帮助
- 文档-Java:,缺少完整的示例
- Stackoverflow:几个问题,以及
- 博客:缺乏完整的例子,尽管很有见地
- 搜索,对于在PlayFramework中设置eBean非常有用
import io.ebean.Finder;
import io.ebean.Model;
import play.data.validation.Constraints;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
//@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends Model {
@Id
@GeneratedValue
private Long userId;
@Constraints.MaxLength(50)
private String name;
@Constraints.MaxLength(100)
private String surname;
@Constraints.Required
@Constraints.MinLength(8)
private String password;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
@Constraints.MaxLength(10)
@Constraints.MinLength(10)
@Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}")
private String cellNumber;
private Boolean emailVerified = false;
private String token;
public static Finder<String, User> find = new Finder<String, User>(User.class);
public User(){}
public User(@Constraints.MinLength(10) @Constraints.MaxLength(10) Long userId, String name, String surname, @Constraints.Required String password, @Constraints.Email @Constraints.Required String email, @Constraints.Required @Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}") String cellNumber, Boolean emailVerified) {
this.userId = userId;
this.name = name;
this.surname = surname;
this.password = password;
this.email = email;
this.cellNumber = cellNumber;
this.emailVerified = emailVerified;
}
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import com.avaje.ebean.Model;
import play.data.validation.Constraints;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type")
public class User extends Model {
@Id
@GeneratedValue
private Long userId;
@Constraints.MaxLength(50)
private String name;
@Constraints.MaxLength(100)
private String surname;
@Constraints.Required
@Constraints.MinLength(8)
private String password;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
@Constraints.MaxLength(10)
@Constraints.MinLength(10)
@Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}")
private String cellNumber;
private Boolean emailVerified = false;
private String token;
public static Finder<String, User> find = new Finder<String, User>(User.class);
public User(){}
}
但是,它会导致一个错误:
CreationException: Unable to create injector, see the following errors:
1) Error injecting constructor, java.lang.NullPointerException
有关完整堆栈跟踪,请参阅
问题(和TL;DR):
TL;博士:一个基本的全功能,有解释,玩!表示上述数据库架构的框架模型。不支持继承类型(截至2017年8月18日) Play使用Ebean ORM,该ORM当前不支持
InheritanceType.TABLE\u PER\u CLASS
或InheritanceType.JOINED
。这是一个悬而未决的问题
我已经证实了这一点。我复制了您的代码并使用InheritanceType.TABLE\u PER\u CLASS
运行它。Play创建了用户表和地址表,但没有创建子表、Staff和Customer
作为参考,要消除错误
Error injecting constructor, java.lang.NullPointerException
…您需要向用户添加@Entity注释以及InheritanceType:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends Model {
...
为了完成,您还需要删除
private Long userId;
…来自员工,因为它是从用户继承的
你有什么选择? 1) 您可以将项目重组为,它支持
InheritanceType.TABLE\u PER\u CLASS
和InheritanceType.JOINED
2) 使用InheritanceType.SINGLE\u表
。此方法将用户、客户和员工数据存储在一个表User中。它可能不是您理想的实现,但它会起作用:
如果你决定这样做,请注意
单表策略将继承结构的所有实体映射到同一个数据库表。这种方法使多态查询非常有效,并提供最佳性能
但它也有一些缺点。所有实体的属性都映射到同一个数据库表。每个记录只使用可用列的一个子集,并将其余列设置为null。因此,您不能对未映射到所有实体的任何列使用NOTNULL约束。这可能会造成数据完整性问题,您的数据库管理员可能对此不太满意
型号:用户
import io.ebean.Finder;
import io.ebean.Model;
import play.data.validation.Constraints;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
//@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends Model {
@Id
@GeneratedValue
private Long userId;
@Constraints.MaxLength(50)
private String name;
@Constraints.MaxLength(100)
private String surname;
@Constraints.Required
@Constraints.MinLength(8)
private String password;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
@Constraints.MaxLength(10)
@Constraints.MinLength(10)
@Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}")
private String cellNumber;
private Boolean emailVerified = false;
private String token;
public static Finder<String, User> find = new Finder<String, User>(User.class);
public User(){}
public User(@Constraints.MinLength(10) @Constraints.MaxLength(10) Long userId, String name, String surname, @Constraints.Required String password, @Constraints.Email @Constraints.Required String email, @Constraints.Required @Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}") String cellNumber, Boolean emailVerified) {
this.userId = userId;
this.name = name;
this.surname = surname;
this.password = password;
this.email = email;
this.cellNumber = cellNumber;
this.emailVerified = emailVerified;
}
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import com.avaje.ebean.Model;
import play.data.validation.Constraints;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type")
public class User extends Model {
@Id
@GeneratedValue
private Long userId;
@Constraints.MaxLength(50)
private String name;
@Constraints.MaxLength(100)
private String surname;
@Constraints.Required
@Constraints.MinLength(8)
private String password;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
@Constraints.MaxLength(10)
@Constraints.MinLength(10)
@Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}")
private String cellNumber;
private Boolean emailVerified = false;
private String token;
public static Finder<String, User> find = new Finder<String, User>(User.class);
public User(){}
}
模型客户:
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
import play.data.validation.Constraints;
@Entity
@DiscriminatorValue("customer")
public class Customer extends User {
@Constraints.Required
@OneToOne(mappedBy = "customer")
private Address address;
private Boolean isStudent = false;
public Customer(){}
public static final Finder<String, Customer> find = new Finder<String, Customer>(Customer.class);
}
@OneToOne
已将客户映射添加到地址
使用间隙2.5.10进行验证
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import com.avaje.ebean.Model;
import play.data.validation.Constraints;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type")
public class User extends Model {
@Id
@GeneratedValue
private Long userId;
@Constraints.MaxLength(50)
private String name;
@Constraints.MaxLength(100)
private String surname;
@Constraints.Required
@Constraints.MinLength(8)
private String password;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
@Constraints.MaxLength(10)
@Constraints.MinLength(10)
@Constraints.Pattern("[0]\\d{2}[- ]{0,1}\\d{3}[- ]{0,1}\\d{4}")
private String cellNumber;
private Boolean emailVerified = false;
private String token;
public static Finder<String, User> find = new Finder<String, User>(User.class);
public User(){}
}
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import play.data.validation.Constraints;
@Entity
@DiscriminatorValue("staff")
public class Staff extends User {
@Constraints.Required
private Boolean isKitchenStaff;
public static Finder<String, Staff> find = new Finder<String, Staff>(Staff.class);
public Staff() {}
}
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
import play.data.validation.Constraints;
@Entity
@DiscriminatorValue("customer")
public class Customer extends User {
@Constraints.Required
@OneToOne(mappedBy = "customer")
private Address address;
private Boolean isStudent = false;
public Customer(){}
public static final Finder<String, Customer> find = new Finder<String, Customer>(Customer.class);
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import com.avaje.ebean.Model;
import play.data.validation.Constraints;
@Entity
public class Address extends Model {
@Id
@Constraints.Required
@GeneratedValue
@Constraints.Max(15)
private Long addressId;
@Constraints.Required
private String unitNumber;
@Constraints.Required
private String streetName;
private String communityName;
private Boolean isCommunity;
@OneToOne
@JoinColumn(name = "user_id")
private Customer customer;
public Address(){}
public static Finder<String, Address> find = new Finder<String, Address>(Address.class);
}