Java 具有复合主键的实体类不';我没有能手和能手

Java 具有复合主键的实体类不';我没有能手和能手,java,jpa,foreign-keys,composite-primary-key,Java,Jpa,Foreign Keys,Composite Primary Key,我有一个实体类userdetails,它有username、userid(数字)和password字段,username和userid构成一个复合主键。这是可以协商的,可能对主要问题不重要 我有另一个类,connectiontable,它的主键是userid。用于生成相关表的sql代码如下所示: create table usertable ( userid int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY

我有一个实体类userdetails,它有username、userid(数字)和password字段,username和userid构成一个复合主键。这是可以协商的,可能对主要问题不重要

我有另一个类,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)

);
这是usertable的sql代码。以下是针对connectiontable的

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) 
);
在connectiontable中还有很多其他的东西,但这些都是不相关的。我使用netbeans7.2.1和javeee6。我使用“从数据库条目创建实体”,但由于某些原因,我没有userid或username的getter和setter。它们在connectiontablePK中,但我似乎无法利用它。例如,在生成jsf页面时,我希望能够执行以下操作:

Connectiontable con = new Connectiontable();
con.getUsername();
但它会抱怨,因为它在connectiontable.java中找不到该方法


有人能告诉我为什么会这样,以及我如何解决它吗?谢谢。

。。。您没有发布Java代码,我怀疑这会有所帮助,但是:

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

@Embeddable
public class UserNameId {
    private int userid;
    private String username;
}
然后
usertable
connectiontable
都包含以下内容(或类似内容):


。。。因此,您应该期望
userNameId
有一个getter/setter,而不是像您期望的那样嵌入字段。

为什么
usertable
的主键是
userid
username
?由于两者都是唯一的,因此其中任何一个都应该对主键起作用(特别是仅使用
userid
就可以使
username
可更新)。请不要在所有内容后面加上
…table
,因为它最终会产生噪音。另外,我对
连接非常怀疑
——我感觉它保存的是分隔数据(逗号分隔列表),这通常是不受欢迎的。出于好奇,您建议我使用什么替代?我使用了一些不同的东西,但我从来没有听说过它是不受欢迎的(请注意,我边学边用,它不是正式类的一部分,所以可能是其中的一部分)。在一列中记录多个值违反了创建良好数据库的主要设计准则之一。在数据库方面,这也使得处理该列变得极其困难。而且在应用程序端处理它通常也不是很有效。实际的设计建议需要更多的信息-发布一个新的问题,其中包含
ConnectionTable
的示例内容(和用法)。很抱歉,我在发布这篇文章时很匆忙,并认为我在最后添加了该代码。我认为你的答案是正确的,但我不确定为什么会这样。这是因为JPA希望id只有一个“值”(嵌入的类应该覆盖
.hashcode()
.equals(…)
。有多列会使它变得困难。
@Embedded
@Id
private UserNameId userNameId;