- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请注意:我是玩框架的新手
信息:
我花了几个小时寻找有关使用 Play Framework 继承的体面教程或解释,
但是每个示例似乎都省略了整个示例,这造成了混淆,因此也是这个问题的原因。
郑重声明,我使用的是 MariaDB(又名 ~MySQL)
研究与文档:
文档- Play :this不是很有帮助
文档 - Java:useful , 缺少完整的例子
博客:This缺乏完整的例子,虽然有见地
搜索Youtube ,对于在 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 io.ebean.Finder;
import play.data.validation.Constraints;
import javax.persistence.Entity;
import javax.persistence.Id;
/**
* Created by cybex on 2017/07/13.
*/
@Entity
public class Staff extends User {
@Id
private Long userId;
@Constraints.Required
private Boolean isKitchenStaff;
public static Finder<String, Staff> find = new Finder<String, Staff>(Staff.class);
public Staff(@Constraints.Required 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, String userId1, @Constraints.Required Boolean isKitchenStaff) {
super(userId, name, surname, password, email, cellNumber, false);
this.isKitchenStaff = isKitchenStaff;
}
}
模型:客户
import io.ebean.Finder;
import play.data.validation.Constraints;
import javax.persistence.Entity;
@Entity
public class Customer extends User {
@Constraints.Required
private Address address;
private Boolean isStudent = false;
public Customer(){}
public Customer(Long userId, String name, String surname, String email, String cellNumber, String password, String userId1, @Constraints.Required Address address, Boolean isStudent) {
/*super(userId, name, surname, email, cellNumber, password, false);*/
this.address = address;
this.isStudent = isStudent;
}
public static final Finder<String, Customer> find = new Finder<String, Customer>(Customer.class);
}
模型:地址
import io.ebean.Finder;
import io.ebean.Model;
import play.data.validation.Constraints;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* Created by cybex on 2017/07/13.
*/
// TODO: 2017/07/13 Add fields for suburb and city for larger projects
@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;
public Address(@Constraints.Required Long addressId, @Constraints.Required String unitNumber, @Constraints.Required String streetName, String communityName, Boolean isCommunity) {
this.addressId = addressId;
this.unitNumber = unitNumber;
this.streetName = streetName;
this.communityName = communityName;
this.isCommunity = isCommunity;
}
public static Finder<String, Address> find = new Finder<String, Address>(Address.class);
}
建议添加:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
但是它会导致错误:
CreationException: Unable to create injector, see the following errors:
1) Error injecting constructor, java.lang.NullPointerException
参见 here完整的堆栈跟踪
问题(和 TL;DR):
TL;DR:一个基本的全功能的,有解释的,玩吧!表示上述数据库模式的框架模型。
最佳答案
不支持的继承类型(截至 2017 年 8 月 18 日)
Play 使用 Ebean ORM,目前不支持 InheritanceType.TABLE_PER_CLASS
或 InheritanceType.JOINED
。这是一个悬而未决的问题listed here .
我已经验证过了。我复制了您的代码并使用 InheritanceType.TABLE_PER_CLASS
运行它。 Play 创建了 User 和 Address 表,但没有创建子表 Staff 和 Customer。
作为引用,消除错误...
Error injecting constructor, java.lang.NullPointerException
...您需要将 @Entity 注释添加到 User 以及 InheritanceType:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends Model {
...
为了完成,您还需要删除...
private Long userId;
...来自 Staff,因为它继承自 User。
您有哪些选择?
1) 您可以将项目重组为 use hibernate with Play ,它支持 InheritanceType.TABLE_PER_CLASS
和 InheritanceType.JOINED
。
2) 使用 InheritanceType.SINGLE_TABLE
。此方法将用户、客户和员工数据存储在一个表 User 中。这可能不是您理想的实现方式,但它会起作用:
如果您决定这样做,请注意...
The single table strategy maps all entities of the inheritance structure to the same database table. This approach makes polymorphic queries very efficient and provides the best performance.
But it also has some drawbacks. The attributes of all entities are mapped to the same database table. Each record uses only a subset of the available columns and sets the rest of them to null. You can, therefore, not use not null constraints on any column that isn’t mapped to all entities. That can create data integrity issues, and your database administrator might not be too happy about it. more on Inheritance Type comparisons
模型:用户
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(){}
}
@DiscriminatorColumn(name = "user_type")
是您区分记录的方式。用户记录的 user_type 值将为 null,客户记录为 customer,员工记录为 staff。
模型:员工
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);
}
@OneToOne
添加到 Customer 的地址映射。
模型地址:
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);
}
@OneToOne
添加到地址的客户映射。
这是使用 Play 2.5.10 验证的。
关于java - 玩!框架数据库继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45652441/
我正在尝试创建一个数据库来处理我在 Play 中的任务!框架。 这是我所拥有的: 在build.sbt中: libraryDependencies ++= Seq( jdbc, cache,
在我的游戏中定义一个表单!当编译器吐出这个奇怪的错误时 Controller :重载方法值映射与替代:...[一堆废话]...Error occurred in an application invo
我的应用程序有问题,@Max约束注释。 我的 Controller 方法定义如下: public static void save(@Required @Max(255) String content
我想创建一个像这样的标签: #{some_tag entity:user, field:'name'} 并期望它通过使用如下表达式生成带有用户名的输出: ${_entity._field} 我知道这行
我创建了一些 Model 对象来代表一家拥有多个客户的公司,以及一个由公司和客户组合以及多个发票行组成的发票对象。我创建了以下模型对象: @Entity public class Company ex
Playframework 现在是 typesafe-stack 的一部分。 那么,如果我要使用像主要语言一样的 Scala ,我现在应该下载什么? TypsafeStack 还是 PlayFrame
在玩!如果你这样称呼: void method() { User u = User(); u.name = "bob"; u.save(); while(true){/* endless loop *
我正在 Play 中构建一个应用程序!包含大量我想跟踪更改的数据的框架。在企业解决方案中,我可能会使用数据库触发器将更改复制到历史表中以跟踪这些更改。我不熟悉 Play!/JPA 中的类似范例,但也许
我一直在学习JavaScript技能,但是遇到一个问题,当单击此处是我的代码时,音频没有被播放。 Your browser does no
我想实现在某些模型保存后在表中插入一行的行为。我当前的解决方案简而言之是:(这只是我的代码示例,因此请不要评论数据库或描述符模型的正确性)。 我有一个监听器,用于在更新/插入实体上插入行为行 Desc
如何使我的模型类字段独一无二?例如。如果已经登录,我想为用户显示正确的消息。我必须自己编写验证检查并使用它,或者可以使用 JPA @UniqueConstraint? 最佳答案 我是这样做的: @En
我使用的是 Play 1.2.1。我想对我的用户密码进行哈希处理。我认为 Crypto.passwordHash 会很好,但事实并非如此。 passwordHash 文档说它返回 MD5 密码哈希值。
我一直在研究戏剧!框架模块并希望扩展它,添加一些功能。我发现了一个从Enhancer(play.classloading.enhancers.Enhancer)扩展的类,但不明白为什么Play!采用了
我使用的是 Play Framework 1.2.5。我有几个与 NAme 和 Age 字段相关的验证。年龄验证无法正常工作。即使年龄大于 18 岁,我也会收到错误消息。 下面是action方法中的验
我使用的是 Play Framework 1.2.5。两者有什么区别: @{Application.render()} 和 @Application.render() 第一个最好用在表单 Action
我是新来的!我被一些总是有错误的表格所困扰。即使所有字段都已填写,我也无法弄清楚问题是什么。 路线 GET /products/ controllers.Pr
我显示可编辑的数据库表行的列表。我想允许用户编辑显示表中的数据并同时保存所有更新。我应该如何取回 Controller 的更新列表? 最佳答案 由于 Play 可以绑定(bind)到 POJO,也可以
那么,假设我从 Controller 异步启动一个作业,然后渲染一些模板。 MyJob job = new MyJob(); job.doJob(); render(); 我的工作看起来像: 导入 p
当前使用的 Play Framework 为 2.0.4。当我尝试使用此命令升级到 2.6.21 时: addSbtPlugin("com.typesafe.play"% "sbt-plugin"%
我目前正在与 Play 合作!框架和看来日志记录只适用于游戏!仅但对于具有 LOGGER 初始化的类不起作用。 这是 logback.xml ${application.hom
我是一名优秀的程序员,十分优秀!