【问题标题】:Entity class with a composite primary key doesn't have getter and setter具有复合主键的实体类没有 getter 和 setter
【发布时间】:2013-01-23 16:57:16
【问题描述】:

我有一个实体类 userdetails,它具有用户名、用户 ID(数字)和密码字段,用户名和用户 ID 形成一个复合主键。这是可以协商的,可能对主要问题不重要。

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

connectiontable 中还有很多其他的东西,但这些都无关紧要。我使用 netbeans 7.2.1 和 Jave EE6。我使用“从数据库条目创建实体”,但由于某种原因,我没有用于用户 ID 或用户名的 getter 和 setter。它们在 connectiontablePK 中,但我似乎无法利用它。例如,当我生成 jsf 页面时,我希望能够执行以下操作:

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

但它会抱怨,因为它在 connectiontable.java 中找不到该方法。

谁能告诉我为什么会这样,我该如何解决?谢谢。

【问题讨论】:

  • 为什么usertable both useridusername 都是主键?由于它们都是唯一的,因此任何一个都应该单独用于主键(尤其是仅使用 userid 将允许您使 username 可更新)。请不要使用...table 为所有内容添加后缀,因为它最终会成为噪音。另外,我对 connections 非常怀疑 - 我感觉它保存了分隔数据(逗号分隔列表),这通常是不受欢迎的。
  • 出于好奇 - 你会建议我用什么来代替?我正在使用不同的东西,但我从来没有听说过它不受欢迎(请注意,我正在学习这一切,它不是官方课程的一部分,所以它可能是它的一部分)。跨度>
  • 在单个列中记录多个值违反了First Normal Form,这是创建良好数据库的主要设计准则之一。这也使得在数据库端处理列 非常 很困难。而且在应用程序端处理它通常也不是很高效。实际设计建议需要更多信息 - 发布一个新问题,示例内容(和使用)ConnectionTable

标签: java jpa foreign-keys composite-primary-key


【解决方案1】:

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

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

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

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

@Embedded
@Id
private UserNameId userNameId;

...所以您应该期待userNameId 的getter/setter,而不是像您期望的那样嵌入字段。

【讨论】:

  • 抱歉,当我发布此内容时我很着急,并以为我在最后添加了该代码。我认为您的回答是正确的,但我不确定为什么会这样。
  • 这是因为 JPA 想要一个 id 的“值”(嵌入式类应该覆盖 .hashcode().equals(...)。拥有多个列会很困难。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2013-12-24
  • 1970-01-01
  • 2019-05-14
  • 2013-08-26
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多