繁体   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