繁体   English   中英

如何解决(Java + Spring + JPA + Hibernate Mappings)关系

[英]How to solve (Java + Spring + JPA + Hibernate Mappings) relationships

我已经阅读了许多有关使用JPA + Hibernate进行映射的主题,但是尝试了几件事之后我无法获得预期的结果。

我已经声明了我所有的单向关系,因为我看不到需要双向关系

我要映射的对象是:客户有一个国家和一个地址列表。

@Table(name = "Client")
@Entity
public class Client
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long id;

    @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST })
    @JoinColumn(name="country_id", unique = false, /*nullable = false,*/ insertable = true, updatable = false, foreignKey = @ForeignKey(name = "country_fk0"))
    private Country country;

    @OneToMany(cascade = { CascadeType.PERSIST }, orphanRemoval = true)
    @JoinColumn(name = "address_id",/* nullable = false,*/ foreignKey = @ForeignKey(name = "address_fk0"))
    private List<Address> address;

//GETTERS / SETTERS
}

然后我将评估客户端并将其保存在新的ClientProcessed表中,该表将引用存储在我的客户端对象中的地址和国家/地区对象。

@Table(name = "ProcessedClient")
@Entity
public class ProcessedClient
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    private Long id;

    @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST })
    @JoinColumn(name="client_evaluation_id", unique = false, /*nullable = false,*/ insertable = true, updatable = false, foreignKey = @ForeignKey(name = "evaluation_fk0"))
    private ClientEvaluation evaluation;

    @OneToOne(cascade = { CascadeType.MERGE })
    @JoinColumn(name="country_id", unique = false, /*nullable = false,*/, foreignKey = @ForeignKey(name = "country_fk1"))
    private Country country;

    @OneToMany(cascade = { CascadeType.MERGE}, orphanRemoval = true)
    @JoinColumn(name = "address_id",/* nullable = false,*/ foreignKey = @ForeignKey(name = "address_fk2"))
    private List<Address> addresses;

//GETTERS / SETTERS
}

所以当我这样做时:

Country country = new Country();
country.setId(1l); // (DB ID)

// I do the same with addresses

ProcessedClient processedClient = new ProcessedClient();
processedClient.setAddresses(addresses);
processedClient.setCountry(country);

this.getDao().save(processedClient);

结果:

org.hibernate.TransientPropertyValueException:对象引用了一个未保存的临时实例-在刷新之前保存该临时实例

谢谢

从文档:

Hibernate定义并支持以下对象状态:

  • 瞬态-如果对象只是使用new运算符实例化的,则该对象是瞬态的,并且它与Hibernate Session无关。 ...
  • 持久-持久实例在数据库中具有表示形式和标识符值。

您应该按ID从数据库加载国家/地区,然后将其设置为ProcessedClient。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM