我有一個包含 100 個欄位的表,我想將其拆分為 3-4 個表。創建時,其中一張表的主鍵將成為其余表的外鍵和主鍵。
我試過這樣的事情
@Entity
public class Entity1 implements Serializable {
@Id
@Column(name = "id")
private String id;
...
}
@Entity
@IdClass(Entity1.class)
public class Entity2 implements Serializable {
@Id
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "id")
private Entity1 id;
...
}
@Repository
public interface Entity1Repository extends JpaRepository<Entity1, String> {
Optional<Entity1> findById(String id);
}
@Repository
public interface Entity2Repository extends JpaRepository<Entity2, Entity1> {
Optional<Entity2> findById(Entity1 id);
}
它正在創建表,但給出錯誤,因為此類 [class xyz.Entity2] 未定義 IdClass
還查看了一些參考資料,例如@MapsId 的使用。但是沒有一個解決方案對我有用。任何輸入?
謝謝
文卡塔·馬杜
uj5u.com熱心網友回復:
我不知道您嘗試使用該MapsId功能的方法是什么。但在這種情況下,它肯定可以幫助您。這是帶有MapsId實作的示例代碼:
@Entity
public class Entity1 implements Serializable {
@Id
private Long id;
private String name;
@OneToOne(mappedBy = "entity1")
private Entity2 entity2;
@OneToOne(mappedBy = "entity1")
private Entity3 entity3;
}
這是只保存OneToOne關聯參考的父類。孩子將是關系的所有者。
這是您的 Entity2 孩子:
@Entity
public class Entity2 implements Serializable {
@Id
private Long id;
private String value;
@MapsId
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "id")
private Entity1 entity1;
}
正如您所說,您將把您的主要物體拼接成多個子物體,我繼續使用另一個子物體來闡明我的觀點:
@Entity
public class Entity3 implements Serializable {
@Id
private Long id;
private String value;
@MapsId
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "id")
private Entity1 entity1;
}
您現在可能已經注意到我正在使用:
@JoinColumn子類中的注釋告訴 hibernate 使用子類的 id 列來映射這個OneToOne與Entity1類的關系。- 我在子類中使用級聯型別 = PERSIST。
第一步需要執行與 id 的關系映射。第二步需要在同一個事務中將所有 3 個物體保存到資料庫中。稍后會詳細介紹。
讓我們看看您現在如何將所有這些物體保存到資料庫中。
@Transactional
public void saveEntities() {
Long id = 1L;
Entity1 entity1 = new Entity1();
entity1.setId(id);
entity1.setName("Test1Entity1: " id);
Entity2 entity2 = new Entity2();
entity2.setValue("entity2Value: " id);
entity2.setEntity1(entity1);
entity2Repository.save(entity2);
Entity3 entity3 = new Entity3();
entity3.setValue("Test3Entity:" id);
entity3.setEntity1(entity1);
entity3Repository.save(entity3);
}
請注意,我沒有將Entity1類與存盤庫一起保存。它由cascadeType=PERSIST我傳遞給OneToOne注釋操作的引數保存。
這應該能夠保存所有物體以及父物體。
注意:之前我談到了級聯型別 = PERSIST 以及為什么它在這里很重要。如果您不使用它,那么您必須先Entity1顯式呼叫存盤庫方法以將其物件保存到資料庫中,然后您可以將它們設定到子物體中。但是如果你這樣做,hibernate 會a different object with the same identifier value was already associated with the session在你對子物體執行保存操作時拋出:例外。
uj5u.com熱心網友回復:
嘗試使用@PrimaryKeyJoinColumn:
@Entity
public class Entity1 {
@Id
@Column(name = "id")
private String id;
...
@OneToOne(mappedBy = "entity1")
@PrimaryKeyJoinColumn
private Entity2 entity2;
}
@Entity
public class Entity2 {
@Id
@Column(name = "entity1_id")
private String id;
...
@MapsId
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "entity1_id)
private Entity1 entity1;
}
public interface Entity2Repository extends JpaRepository<Entity2, String>
測驗:
@Test
void save() {
Entity1 entity1 = new Entity1();
entity1.setId("iddddd");
Entity2 entity2 = new Entity2();
detail.setEntity1(entity1);
this.entity2Repository.save(entity2);
}
參考:共享主鍵
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351321.html
