JPA Hibernate - 如何从两个连接的实体中保存两个对象

时间:2018-01-17 03:38:59

标签: spring hibernate maven netbeans spring-data-jpa

我有两个实体:帐户和个人资料。它们与一对一的关系相关联。

帐户实体:

@Entity
@Table(name = "account")
public class Account {

    @Id
    @Column(name = "account_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne
    private Profile profile;

    ...

}

个人资料:

@Entity
@Table(name = "profile")
public class Profile {

    @Id
    @Column(name = "profile_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(mappedBy = "profile", cascade = CascadeType.ALL)
    private Account account;

    ...

}

问题是当我尝试在数据库中保存时,来自Account的新对象和来自Profile的新对象并连接它们。像这样:

Account account = new Account();
Profile profile = new Profile();
profile.setAccount(account);
account.setProfile(profile);

accountRepository.save(account);
profileRepository.save(profile);

当然这不起作用。在搜索解决方案后,我发现必须使用persist方法和Transactions。但是我还没有找到如何使用它们。我尝试使用EntityManager并创建一个persistence.xml文件,但是Spring找不到它(我把它放在目录中:src / main / resources / Meta-INF)。

我的问题是:是否有更简单的方法来保存两个对象(无需创建新的xml文件等)?如果没有我到底需要做什么,为了使它有效?

我使用带有hibernate和mysql的spring,在Netbeans中使用Maven。

2 个答案:

答案 0 :(得分:0)

您应该更改保存顺序。在配置文件之前无法创建帐户实体。

Account account = new Account();
Profile profile = new Profile();
profile.setAccount(account);
account.setProfile(profile);

profileRepository.save(profile);
accountRepository.save(account);

答案 1 :(得分:0)

我终于解决了! 问题是CascadeType.All属性位置错误。它应该在帐户实体中。此外,不需要profileRepository.save(profile),因为帐户的级联管理配置文件的保存。当我尝试使用JSON显示一个帐户时,我也遇到了一些问题,并且永远递归,由于this stackoverflow answer@JsonManagedReference@JsonBackReference),我解决了这个问题。

所以现在我的代码看起来像这样:

帐户实体:

@Entity
@Table(name = "account")
public class Account {

    @Id
    @Column(name = "account_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="profile_id")
    @JsonManagedReference
    private Profile profile;

    ...

}

个人资料实体:

@Entity
@Table(name = "profile")
public class Profile {

    @Id
    @Column(name = "profile_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(mappedBy="profile")
    @JsonBackReference
    private Account account;

    ...

}

对于数据库中的保存:

Account account = new Account();
Profile profile = new Profile();
profile.setAccount(account);
account.setProfile(profile);

accountRepository.save(account);