亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

休眠中的外鍵,為什么創建對象,如何更新引用實體中的記錄

休眠中的外鍵,為什么創建對象,如何更新引用實體中的記錄

鳳凰求蠱 2022-01-06 17:45:08
我是 Hibernate 環境的新手。我有一個基本問題,我仍在努力理解為什么人們選擇 Hibernate 而不是 SQL。我有兩張表,可以說一張是用戶,一張是書。一個用戶可以擁有多本書,但一本書只有一個所有者。如果我使用 SQL,我嘗試寫在Table User,   int uid  PRIMARY KEY (uid)Table Book,    int bid    int oid //ownerid    PRIMARY KEY (bid)    FOREIGN KEY (oid) REFERENCES User(uid) 我無法在 Hibernate 中執行此操作。我嘗試了以下方法:生成了一個沒有任何關系的用戶表,只有@Iduid 的注解。@Entity@Table(name="USER")public class User {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    @Column(name = "uid")    private Long uid;    public Long getUid()    { return uid;}}生成了一個書桌,但我無法理解這一點?;ヂ摼W上的一切都說我需要使用@ManyToOne和@JoinColumns。如果我使用它們,我需要有一個對象:@Entity@Table(name = "BOOK")public class Book{    @ManyToOne    @JoinColumn(name="uid",       referencedColumnName = "What should I write here?")    @Column(name ="oid") //owner id    private User user;}1- 為什么我需要在書表中為我的 uid 創建一個用戶對象?我只想用外鍵約束在我的書籍表中存儲一個用戶 ID(如果用戶不存在,那么這本書也不能存在)2-另外,如果我想訪問所有者的用戶 ID,我應該使用這個:public Long getOwnerId(){ return user.getUid();}3- 如果我想更改書的所有者,我該怎么做?由于我的 book 對象中有一個完整的用戶成員,我如何只更新我的 book 表中的 ownerid?
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

在 ManyToOne 實體中,您只需要在 @JoinColumn 注釋中指定外鍵的名稱,如下所示:


@Entity

@Table(name = "BOOK")

public class Book{

   //private Long bid;


   @ManyToOne

   @JoinColumn(name="oid")

   private User user;

}

參數referencedColumnName最常用于多對多關系。



查看完整回答
反對 回復 2022-01-06
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

Hibernate 是一個對象關系映射器,以通常的面向對象的方式表示關系數據庫的基于表的數據結構,僅此而已。


您不必使用@ManyToOne、@OneToMany 等注釋。您可以這樣做:


@Entity

@Table(name="USER")

public class User {

    @Id

    @Column(name = "uid")

    private Long uid;


    // setters and getters

}


@Entity

@Table(name = "BOOK")

public class Book {


    @Id

    @Column(name = "bid")

    private Long bid;


    @Column(name = "oid")

    private Long oid;


    // setters and getters

}


EntityManager em;

Long uid = em.createQuery("SELECT u.uid FROM User u WHERE ....", Long.class).getSingleResult();

book.setUid(uid);

大多數開發人員不想處理那么多的 ID 和數據庫訪問等。他們只想以一種自然的面向對象的方式訪問他們的業務模型,然后 hibernate 或 JPA 進來了:


EntityManager em;

User user1 = em.find(User.class, 1L);

Book book1 = new Book();

book1.setUser(user1);    

您不必為每個 Book 實例創建一個 User 實例。只需重用現有的 User 實例。

在您的示例中,我將執行以下操作:


@Entity

@Table(name="USER")

public class User {

    // ...

    @OneToMany(mappedBy = "user")

    private Collection<Book> books = new ArrayList<>();


    public void add(Book book) {

        book.setUser(this);

        books.add(book);

    }


    public void remove(Book book) {

        book.setUser(null);

        books.remove(book);

    }

}


@Entity

@Table(name = "BOOK")

public class Book {

    // ...

    @ManyToOne

    @JoinColumn(name="oid", referencedColumnName = "uid")

    private User user;

}


EntityManager em;

User user1 = em.find(User.class, 1L);

Book book1 = new Book();

Book book2 = new Book();

user1.addBook(book1);

user1.addBook(book2);


book1.getUser(); // user1

book2.getUser(); // user1    

是的,如果你想處理裸 ID


通過 setter 設置另一個用戶。book表中對應的uid會被更新。


book1.setUser(user2);


將導致聲明


update BOOK set oid = 2 where bid = 1;


查看完整回答
反對 回復 2022-01-06
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

為什么我需要在 book 表中為我的 uid 創建一個用戶對象?


您無需對數據庫表進行任何更改。Hibernate 將從 book 表中讀取 oid,并將Book.user使用此 oid 標識的 User 類型的對象填充該字段。


這樣,例如,當您在應用程序中顯示有關一本書的信息時,并且希望顯示所有者的姓名時,您需要做的就是


display(book.getUser().getName());

不必獲取用戶的 ID,然后執行第二個數據庫查詢來獲取用戶。


如果我想訪問所有者的用戶 ID,我應該使用這個:


是的?;蛘吣惶砑尤魏畏椒?,因為任何調用者都可以book.getUser().getUid()自己完成。


如果我想更改書的所有者,我應該怎么做?


假設您擁有新所有者的 uid,您將獲得由此 ID 標識的用戶,并在書上設置:


User newOwner = entityManager.find(User.class, newOwnerId);

// or User newOwner = entityManager.getReference(User.class, newOwnerId);

// depending on what you prefer

book.setUser(newOwner);

關于您對多對一的映射,這是錯誤的。您需要閱讀 Hibernate 手冊和 javadoc,而不是隨意嘗試。它應該只是


@ManyToOne

@JoinColumn(name = "oid")

private User user;


查看完整回答
反對 回復 2022-01-06
  • 3 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號