我是一个有游戏框架的初学者。关于JPA和游戏框架中的映射的问题,
我有一个学生表和一个由一对一关系约束的导师表。
学生表:
id, name, class, grade
导师表:
id, name, department, student_id
在上文中,导师可能有也可能没有绑定他/她的学生。我正在使用一对一的映射制作导师模型,
@OneToOne
@JoinColumn(name="fk_student_id", referencedColumnName="id")
private student Student;
当我尝试运行时,我得到了一个
发生JPA错误(无法构建EntityManagerFactory):属性映射列数错误:models.Mentor.student类型:models.Student。
我确信我已将所有学生字段映射如下,
@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;
我在这里缺少什么?
感谢您的时间。
此致 阿比
答案 0 :(得分:2)
您确定这是适用于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扩展时不需要该字段。你是从模型扩展吗?
答案 1 :(得分:0)
如果您想要对您的ID和序列策略进行一些控制,也可以使用GenericModel
来自play official documentation:
使用GenericModel进行自定义ID映射:
没有什么可以强迫你将你的实体建立在play.db.jpa.Model上。您的JPA实体也可以扩展play.db.jpa.GenericModel类。如果您不想使用Long id作为实体的主键,则需要这样做。例如,这是一个非常简单的User实体的映射。 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;
}