我有兩個表:users 和 userdetails,如下所示:
package com.example.easynotes.model;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "users")
@IdClass(UserID.class)
public class User implements Serializable {
@Id
int id;
@Id
String name;
String department;
//getters and setters
}
userdetails 類將是這樣的:
public class UserDetails implements Serializable{
int id;
String name;
String address;
String otherFields;
//getters and setters
}
users 中的 id 和 name 是復合主鍵,我希望 userdetails 中的相同欄位作為外鍵。我怎樣才能在休眠中實作這一點?
uj5u.com熱心網友回復:
我們需要將兩個鍵都放入@Embeddable以分離復合鍵,然后將其放入User物體中@EmbeddedId并使用Hibernate Relational Mapping...映射兩個主鍵。
有兩種選擇Composite Primary Key:
- 使用
@EmbeddedId - 使用
@IdClass()
下面是例子:
----------------------------- 使用 EmbeddedId ------------- ---------------
復合主鍵:
@Embeddable
public class UserIdName implements Serializable {
int id;
String name;
// getter and setter
}
用戶:
@Entity
@Table(name = "users")
public class USER{
@EmbeddedId
private UserIdName id;
String department;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Set<Userdetail> userdetail;
// getter and setter
}
用戶詳細資訊:
@Entity
@Table(name = "Userdetail")
public class Userdetail {
@Id
private int detail_id;
@ManyToOne
@JoinColumns({ @JoinColumn(name = "id", referencedColumnName = "id"),
@JoinColumn(name = "name", referencedColumnName = "name") })
private USER user;
String address;
String otherFields;
// getter setter
}
--------------------- 使用IdClass ------------- ---------------
復合主鍵:
public class UserIdName implements Serializable {
int id;
String name;
// getter and setter
}
用戶:
@Entity
@Table(name = "users")
@IdClass(UserIdName.class)
public class USER{
@Id
int id;
@Id
String name;
String department;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Set<Userdetail> userdetail;
// getter and setter
}
用戶詳細資訊:
@Entity
@Table(name = "Userdetail")
public class Userdetail {
@Id
private int detail_id;
@ManyToOne
@JoinColumns({ @JoinColumn(name = "id", referencedColumnName = "id"),
@JoinColumn(name = "name", referencedColumnName = "name") })
private USER user;
String address;
String otherFields;
// getter setter
}
-> 如果您想手動插入兩個外鍵,請嘗試以下代碼
把這段代碼放進去 UserDetails
@ManyToOne
@JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
@JoinColumn(name = "name", referencedColumnName = "name", insertable = false, updatable = false)
private USER user;
@Column(name="id")
private int id;
@Column(name="name")
private String name
// don't forget to put getter setter
用戶表:

用戶詳細資訊表:

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347728.html
