用户类型、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 
    ...


当我这样做时,创建的EmployeeClient 表没有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和Threads在play框架中

JPA 和 Play 框架:EntityManager 没有名为更新的持久性提供程序

Play Framework 1 使用啥来实现 ORM?

有没有相当于Play的桌面!框架?

使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?

Java /JPA |具有指定继承类型的查询