Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 玩框架数据库继承_Java_Mysql_Inheritance_Playframework_Playframework 2.0 - Fatal编程技术网

Java 玩框架数据库继承

Java 玩框架数据库继承,java,mysql,inheritance,playframework,playframework-2.0,Java,Mysql,Inheritance,Playframework,Playframework 2.0,请注意:我是新来玩框架的 信息: 我已经花了几个小时寻找关于使用Play Framework继承的教程或解释 然而,每个例子似乎都忽略了整个例子,这造成了混乱,因此提出这个问题的原因 作为记录,我使用的是MariaDB(aka~MySQL) 研究与文档: 文档-播放:不是很有帮助 文档-Java:,缺少完整的示例 Stackoverflow:几个问题,以及 博客:缺乏完整的例子,尽管很有见地 搜索,对于在PlayFramework中设置eBean非常有用 然而,我可能完全被误解了,但是示例提

请注意:我是新来玩框架的

信息:

我已经花了几个小时寻找关于使用Play Framework继承的教程或解释

然而,每个例子似乎都忽略了整个例子,这造成了混乱,因此提出这个问题的原因

作为记录,我使用的是MariaDB(aka~MySQL)

研究与文档:

  • 文档-播放:不是很有帮助

  • 文档-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);
}