擁有這個物體:
User.java:
@Entity
@NoArgsConstructor
@Getter
@Setter[/span
public class User {
@Id
private int id;
private String username;
@OneToMany(mappedBy = "所有者")
@MapKey(name = "friend_id")
private Map<User,Friendship> friends = new HashMap<>()。
}
友情:
@Entity
@Data
//@IdClass(Friendship.class)
public class Friendship implements Serializable {
@Id
private int owner_id。
@Id
private int friend_id;
private String level;
@ManyToOne
@MapsId("所有者_id")
private 用戶所有者。
@ManyToOne
@MapsId("friend_id")
private User friend。
}
雖然我必須有 @IdClass或@EmbeddedId如果我想使用兩個或更多主鍵。但是,如上所示,我可以省略其中任何一個,只宣告兩個主鍵(這就是我所說的 "編譯")。那么問題來了,為什么還要麻煩地使用這些注釋,而只是宣告更多的鍵呢?
生成的表:
----------- -------------- ------ ----- --------- -------
| 欄位 | 型別 | Null | Key | Default | Extra |
----------- -------------- ------ ----- --------- -------
| owner_id | int | NO | PRI | NULL |
| friend_id | int | NO | PRI | NULL |
| level | varchar(255) | | YES | | NULL | |
----------- -------------- ------ ----- --------- -------
uj5u.com熱心網友回復:
:復合識別符號必須由 "主鍵類"(例如,
@EmbeddedId或@IdClass)來表示,這一限制只是JPA特有的。Hibernate確實允許通過多個
@Id屬性來定義沒有 "主鍵類 "的復合識別符號。
盡管這種映射比使用@EmbeddedId或@IdClass要簡單得多,但是物體實體和實際識別符號之間并沒有分離。要查詢這個物體,必須向持久化背景關系提供該物體本身的實體。
@Entity
public class Friendship implements Serializable {
/*
最好使用物件封裝類而不是相應的
原始型別。因為,比如說,未初始化的Integer是null。
但未初始化的int是0,可以是一個合法的id。
*/
@Id
private Integer ownerId。
@Id
private Integer friendId;
public Friendship() {
}
public Friendship(Integer ownerId, Integer friendId) {
this.ownerId = ownerId。
this.friendId = friendId。
}
// ...。
}
Friendship friendship = entityManager. find(Friendship.class, new Friendship(ownerId, friendId))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309832.html
標籤:
上一篇:如果集合被重新初始化,Hibernate會觸發洗掉陳述句
下一篇:在使用QuarkusHibernateReactive與quarkus-reactive-client時,如何使用一些阻塞的方法?
