簡體   English   中英

Spring JPA ManyToOne - 在刷新之前保存瞬態實例

[英]Spring JPA ManyToOne - Save the transient instance before flushing

我創建了一個具有數據庫訪問權限的Spring Web Application 我有一個類Person - 它引用了一個類Address personcompany都有Address ,因此personcompany都參考Address表。 我通過定義從個人到地址以及公司的@ManyToOne關系來做到這一點。

    @ManyToOne
    @JoinColumn (name="COMPANY_ID")
    private Adress companyId;

    @ManyToOne
    @JoinColumn (name="SUBSIDIARY_ID")
    private Adress subsidiaryId;

在個人存儲庫中,我有一個像這樣的保存方法:

 public Person save(Person entity) {

    SaveAccess<Person> ao = createSaveAccess();

    ao.setEntity(entity);
    ao.execute();
    return ao.getResult();
}

問題是,如果我嘗試添加一個新人,我會得到一個Hibernate-TransientPropertyValueException ,它表示Object references an unsaved transient instance - save the transient instance before flushing. 有人能幫我一下嗎?

你能試試這個嗎

@ManyToOne(cascade = CascadeType.ALL)

    @JoinColumn (name="COMPANY_ID")
    private Adress companyId;

   @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn (name="SUBSIDIARY_ID")
    private Adress subsidiaryId;

參考: Hibernate TransientPropertyValueException 保存數據時

https://dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-one-using-annotations-1.html

我有一個類似的問題,一個名為Product的表的@OneToOne注釋到另一個名為Category 我想指定每個Product必須有一個Category

因此,我必須確保將級聯類型設置為CascadeType.ALL如下所示:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "CATEGORY_NAME")
private Category category;

我不認為地址包含如此多的數據,因此可以將其作為獨立實體進行存儲。 出於性能考慮,我建議您為此使用可嵌入 + 嵌入的類:

@Embeddable
public class Address
{
  String number;
  String street;
  String city;
  String country;
}

@Entity
public class Person
{
  @Id
  protected long id
  ...
  @Embedded
  Address address;
  @Embedded
  Address companyAddress;
  ...
}

如果您有舊系統並且必須將地址存儲在單獨的表中,則可以使用 @SecondaryTable 解決方案:

@Entity
@Table(name = "EMPLOYEE")
@SecondaryTable(name = "ADDRESS", pkJoinColumns = @PrimaryKeyJoinColumn(name = "EMPLOYEE_ID"))
public class Employee
{
    //...
    @Column(table = "ADDRESS")
    private Address address;

    @Column(table = "ADDRESS")
    private Address companyAddress;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM