2013-01-23 49 views
0

我有一个实体类userdetails,它具有username,userid(数字)和密码字段,其中username和userid形成一个复合主键。这是可以谈判的,对主要问题可能并不重要。具有复合主键的实体类没有getter和setter

我有另一个类,connectiontable,它有userid作为主键。用于生成相关表的sql代码如下所示:

create table usertable 
(
userid int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
username varchar(128) NOT NULL UNIQUE, 
password varchar(128) NOT NULL, 
CONSTRAINT USER_PK PRIMARY KEY(username, userid) 

); 

这是用于使用的sql代码。以下是可连接的

create table connectiontable 
(
userid int not null, 
username varchar(128) not null, 
connections varchar(32670) not null, 

CONSTRAINT CONNECTION_PK PRIMARY KEY(username, userid), 
CONSTRAINT CONNECTION_FK FOREIGN KEY(username,userid) REFERENCES usertable(username,userid) 
); 

有很多其他的东西在可连接,但是那些是不相关的。我使用netbeans 7.2.1和Jave EE6。我使用“从数据库条目创建实体”,但由于某种原因,我没有getter和setter用于用户名或用户名。他们可以连接PK,但我似乎无法利用这一点。例如,当我生成JSF页面,我希望能够做一些事情,如:

Connectiontable con = new Connectiontable(); 
con.getUsername(); 

但它抱怨,因为它无法找到connectiontable.java该方法。

任何人都可以告诉我为什么会出现这种情况,我该如何解决它?谢谢。

+0

为什么'usertable' _both_' userid'和'username'的主键?由于它们都是唯一的,所以任何一个人都应该为主键工作(特别是因为只使用'userid'就可以让'username'更新)。请不要用'...表格'将所有内容加后缀,因为它最终会变成噪音。另外,我对“连接”非常怀疑 - 我有一种感觉,它持有分隔数据(逗号分隔列表),这通常是不被接受的。 –

+0

出于好奇 - 你会推荐我使用什么呢?我正在使用一些不同的东西,但我从来没有听说过它被人们所忽视(请注意,我正在学习这一切,因为它不是官方课程的一部分,因此可能是其中的一部分)。 – AodhanOL

+0

在单个列中记录多个值违反了[First Normal Form](http://en.wikipedia.org/wiki/First_normal_form),这是创建良好数据库的主要设计准则之一。它还使得在数据库方面处理列非常困难。并且在应用程序方面处理它也不常见。实际设计建议需要更多信息 - 发布一个带有“ConnectionTable”示例内容(和使用)的新问题。 –

回答

1

...你不是发布Java代码,我怀疑会忍不住:

随时在JPA当你有一个复合主键,你必须有一个“嵌入式”主键类。我怀疑你有类似下面的类定义:

@Embeddable 
public class UserNameId { 
    private int userid; 
    private String username; 
} 

然后usertableconnectiontable都包含以下(或类似):

@Embedded 
@Id 
private UserNameId userNameId; 

...所以你应该期待一个getter /对于userNameId,但不是嵌入式字段,就像你期望的那样。

+0

对不起,我发布这个时很匆忙,并认为我在最后添加了该代码。我认为你的回答是正确的,但我不确定为什么会这样。 – AodhanOL

+0

这是因为JPA需要一个'value'作为id(嵌入类应该重载'.hashcode()'和'.equals(...)'。 –

相关问题