我有两个实体:帐户和个人资料。它们与一对一的关系相关联。
帐户实体:
@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。
答案 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);