我是一个玩框架的初学者。再次是关于JPA和游戏框架中的映射的问题,
我有一个学生桌和一个导师桌,由一对一的关系绑定。
学生表:
id, name, class, grade
导师表:
id, name, department, student_id
在上文中,导师可能会也可能不会让学生与他/她绑定。我正在制作一对一映射的导师模型,
@OneToOne
@JoinColumn(name="fk_student_id", referencedColumnName="id")
private student Student;
当我试着运行这个时,我会得到一个
出现JPA错误(无法生成EntityManagerFactory):属性映射的列数错误:models。导师/学生类型:模特。大学生
我确信我已经将所有学生字段映射如下,
Student.java
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Column(name="name")
private String name;
@Column(name="class")
private String cls;
@Column(name="grade")
private String grade;
我在这里错过了什么?
谢谢你抽出时间。
谨致问候,Abi
你确定这是Play Framework的工作代码吗?在创建模型时,Play和标准JPA之间存在一些差异。这个片段:
@OneToOne
@JoinColumn(name="fk_student_id", referencedColumnName="id")
private student Student;
是错误的。应该是类似的东西
@OneToOne
@JoinColumn(name="fk_student_id") //removed the id reference, let JPA manage it
public Student student; //note order of class and var name
此外,您正在定义一个"id"字段,在从Model扩展时不需要该字段。你是从Model扩展的吗?
如果您想控制您的id和序列策略,也可以使用GenericModel
来自游戏官方文档:
使用GenericModel的自定义id映射:
没有什么可以强迫您将实体建立在play.db.jpa.Model上。您的jpa实体还可以扩展play.db.jpa.GenericModel类。如果您不想使用Long id作为实体的主键,这是必需的。例如,这里有一个非常简单的用户实体的映射。id是UUID,名称和邮件属性是必需的,我们使用Play Validation来强制执行简单的业务规则。
@Entity
public class User extends GenericModel {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
public String id;
@Required
public String name;
@Required
@MaxSize(value=255, message = "email.maxsize")
@play.data.validation.Email
public String mail;
}