用户类型、jpa 和 Play 的继承问题!框架
Posted
技术标签:
【中文标题】用户类型、jpa 和 Play 的继承问题!框架【英文标题】:Types of users, inheritance issue with jpa and Play! Framework 【发布时间】:2012-09-05 19:43:00 【问题描述】:我正在尝试在我的应用程序中实现用户类型的继承结构。
@Entity
@Table(name="User_") // Need this since "User" is a reserved name in SQL Server
@Inheritance(strategy=InheritanceType.JOINED)
public class User extends Model
@Column(nullable=false,unique=true)
public String username;
...
@Entity
public class Employee extends User
...
@Entity
public class Client extends User
...
当我这样做时,创建的Employee
和Client
表没有User_
表的任何外键,User_
表也没有Employee
的任何外键或Client
表。我怎样才能做到这一点?
理想情况下,我想要一个Employee.username
列,它是User_
的外键,所以我的其他表可以引用Employee.username
。
我正在使用 Play!框架 1.2.5 和 SQL Server 2005。
【问题讨论】:
您确定没有创建外键吗?id
列应该是外键。另外,您可以使用@Table(name="\"User\"")
。
(必须删除才能编辑评论)使用不带下划线的名称 @Table(name="Users")
Users
不受限制。使用 Azure SQL 检查。
axtavt,你是对的。仔细检查后,id 既是 FK 也是 PK。我没想到。有什么方法可以将用户名作为字符串显示在Employee
中?我希望能够在其他表上执行此操作:@ManyToOne @JoinColumn(name="employee", referencedColumnName="username") public Employee employee;
另外,感谢你们两位对表名的建议,两者都有效!
【参考方案1】:
我想你正在寻找这个:http://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html
另外,请注意您应该实现一个鉴别器值。
您可以在此处阅读该主题:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1168
【讨论】:
我之前尝试过同时实现@DiscriminatorValue
和@PrimaryKeyJoinColumn
,但它们似乎没有任何作用,所以我摆脱了它们。也许我做错了......
谷歌搜索会找到一些使用它的例子。【参考方案2】:
几天后回答我自己的问题。
我问的第一个问题是:
当我这样做时,创建的 Employee 和 Client 表没有 User_ 表的任何外键,User_ 表也没有 Employee 或 Client 表的任何外键。我怎样才能做到这一点?
这在 cmets 中得到了回答,谢谢 axtavt!原来id
是主键而是外键。
接下来,我在我的问题中写了这个:
理想情况下,我想要一个 Employee.username 列,它是 User_ 的外键,以便其他表可以引用 Employee.username。
并在 cmets 中作为一个问题澄清/措辞:
有什么方法可以将用户名作为字符串显示在
Employee
中?我希望能够在其他表上执行此操作:
@ManyToOne
@JoinColumn(name="employee", referencedColumnName="username")
public Employee employee;
我一直找不到合适的答案,所以我只好使用默认值(使用数字 id 字段):
@ManyToOne
public Employee employee;
如果可以解决,我很乐意接受另一个答案。
【讨论】:
以上是关于用户类型、jpa 和 Play 的继承问题!框架的主要内容,如果未能解决你的问题,请参考以下文章
JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序