Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义复合主键?_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

Java 如何定义复合主键?

Java 如何定义复合主键?,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我有一个数据库表。表的DDL为: CREATE TABLE `acsblts` ( `usrnm` varchar(64) NOT NULL, `rl` varchar(64) NOT NULL, UNIQUE KEY `acsblts_idx_1` (`usrnm`,`rl`), CONSTRAINT `acsblts_ibfk_1` FOREIGN KEY (`usrnm`) REFERENCES `lgn_crdntls` (`usrnm`) ) 现在我想为这个表创建Ja

我有一个数据库表。表的DDL为:

CREATE TABLE `acsblts` (
  `usrnm` varchar(64) NOT NULL,
  `rl` varchar(64) NOT NULL,
  UNIQUE KEY `acsblts_idx_1` (`usrnm`,`rl`),
  CONSTRAINT `acsblts_ibfk_1` FOREIGN KEY (`usrnm`) REFERENCES `lgn_crdntls` (`usrnm`)
)
现在我想为这个表创建Java类。我所做的是:

@Entity
@Table(name = "acsblts", uniqueConstraints = { @UniqueConstraint(columnNames = { "rl", "usrnm" }) })
public class Acsblts {

    @NotNull
    @Column(name = "rl")
    private String rl;

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinColumn(name = "usrnm", nullable = false)
    @JsonIgnore
    private LgnCrdntls usrnm;

    // Constructors, Getters, Setters

}
当我尝试运行应用程序时,它显示错误:

未为实体指定标识符:com.example.mngmntsstm.entity.user.Acsblts

我的理解是:缺少
@Id
导致了错误如何使用
rl
usrnm
创建复合主键

使用以下
id
作为主键而不是复合主键是一个好主意吗

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

使用长ID作为主键将有助于更快地搜索结果,这是由于索引的缘故。但是,如果您仍然想使用主复合键,请参考以下链接,并尝试将它们应用于您的问题

  • 我认为对你来说,最简单的方法就是使用
  • @实体
    @表(name=“acsblts”)
    公共类Acsblts实现可序列化
    {
    @身份证
    @列(name=“rl”)
    私有字符串rl;
    @身份证
    @许多酮
    @JoinColumn(name=“usrnm”,nullable=false)
    私人LgnCrdntls usrnm;
    公众谘询委员会()
    {}
    公共Acsblts(字符串rl、字符串usrnm)
    {
    此参数为0.rl=rl;
    this.usrnm=新的LgnCrdntls(usrnm);
    }
    //能手,二传手
    @凌驾
    公共布尔等于(对象obj)
    {
    如果(this==obj)返回true;
    if(obj==null | | getClass()!=obj.getClass())返回false;
    Acsblts,即=(Acsblts)obj;
    返回Objects.equals(rl,that.rl)&&
    Objects.equals(usrnm,that.usrnm);
    }
    @凌驾
    公共int hashCode()
    {
    返回Objects.hash(rl,usrnm);
    }
    }
    
    请注意,由于实体实例和实际标识符之间没有分隔,因此应将
    Acsblts
    的实例作为
    primaryKey
    参数传递给
    find
    方法

    Acsblts dat=session.find(Acsblts.class,新的Acsblts(“CRD2”、“RL5”);
    
  • 你也可以使用
  • 在这种情况下,应按以下方式声明
    AcsbltsPK
    类:

    @可嵌入
    公共类AcsbltsPK实现可序列化
    {
    @列(name=“rl”)
    私有字符串rl;
    @许多酮
    @JoinColumn(name=“usrnm”)
    私人LgnCrdntls usrnm;
    @凌驾
    公共布尔等于(对象obj)
    {
    如果(this==obj)返回true;
    if(obj==null | | getClass()!=obj.getClass())返回false;
    AcsbltsPK pk=(AcsbltsPK)obj;
    返回Objects.equals(rl,pk.rl)&&
    Objects.equals(usrnm,pk.usrnm);
    }
    @凌驾
    公共int hashCode()
    {
    返回Objects.hash(rl,usrnm);
    }
    }
    
    然后在
    Acsblts
    实体中使用它:

    @实体
    @表(name=“acsblts”)
    公共级Acsblts
    {
    @嵌入ID
    私人AcsbltsPK pk;
    // ...
    }
    
  • 您也可以使用
  • 使用以下id作为主键而不是复合主键是一个好主意吗

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    
    你应该纠正你现有的错误。有时,这是不可接受的