Java 如何定义复合主键?
我有一个数据库表。表的DDL为: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
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
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
你应该纠正你现有的错误。有时,这是不可接受的