Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JPA ManyTone-刷新前保存临时实例_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring JPA ManyTone-刷新前保存临时实例

Java Spring JPA ManyTone-刷新前保存临时实例,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我创建了一个具有数据库访问权限的springweb应用程序。我有一个classPerson——它引用了class地址。一个人既有地址也有公司,因此person和company都参考地址表。为此,我定义了一个从个人到地址以及公司的@ManyToOne关系 @ManyToOne @JoinColumn (name="COMPANY_ID") private Adress companyId; @ManyToOne @JoinColumn (name="SUB

我创建了一个具有数据库访问权限的
springweb应用程序
。我有一个class
Person
——它引用了class
地址
。一个人既有地址也有公司,因此
person
company
都参考
地址表。为此,我定义了一个从个人到地址以及公司的
@ManyToOne
关系

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

    @ManyToOne
    @JoinColumn (name="SUBSIDIARY_ID")
    private Adress subsidiaryId;
在person存储库中,我有一个保存方法,如下所示:

 public Person save(Person entity) {

    SaveAccess<Person> ao = createSaveAccess();

    ao.setEntity(entity);
    ao.execute();
    return ao.getResult();
}
公共人物保存(人物实体){
SaveAccess ao=createSaveAccess();
ao.实体(实体);
ao.execute();
返回ao.getResult();
}
问题是,如果我尝试添加一个新人,我会得到一个
Hibernate TransientPropertyValueException
,上面说
对象引用了一个未保存的临时实例-在刷新之前保存临时实例。
这里有人能帮我吗?

你能试试吗

@ManyToOne(cascade = CascadeType.ALL)

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

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


我认为地址包含的数据太多,不足以作为独立实体存储。出于性能考虑,我建议您为此使用Embeddeble+嵌入式类:

@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;
}

我在一个名为
Product
的表到另一个名为
Category
的表的
@OneToOne
注释中遇到了类似的问题。我想指定每个
产品
必须有一个
类别

因此,我必须确保将级联类型设置为
CascadeType

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

谢谢你的回答。问题是,如果companyId和subdiaryId不同,并且不在数据库中,那么它现在就可以工作了。但是如果subdiaryID和companyId相同或者其中一个在数据库中,我会得到一个违反UniqueConstraint的异常。我必须在这里进行双向关联吗?类似于地址中的一对一映射?这样:
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name=“COMPANY\u ID”)私有设置个人公司;@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name=“SUBSIDIARY\u ID”)私有设置个人子公司
您找到了一个解决方案吗?当公司和子公司已经存储在数据库中时,如何更新它们?不幸的是,我无法做到这一点,因为需要将地址存储在数据库中一个单独的表中。这是因为我们不仅需要人的地址,还需要其他实体的地址。在这种情况下,您可以应用@SecondaryTable解决方案。我修改了我的答案。问题是,我也需要一个实体地址,因为我有一个rest服务,它会返回它们。