【发布时间】:2017-09-10 12:12:30
【问题描述】:
我正在编写一个 Spring Boot 应用程序,它将使用 Hibernate/JPA 在应用程序和 MySQL 数据库之间持久化。
这里我们有以下 JPA 实体:
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
@Type(type="uuid-binary")
private UUID refId;
}
@Entity(name = "contacts")
@AttributeOverrides({
@AttributeOverride(name = "id", column=@Column(name="contact_id")),
@AttributeOverride(name = "refId", column=@Column(name="contact_ref_id"))
})
public class Contact extends BaseEntity {
@Column(name = "contact_given_name")
private String givenName;
@Column(name = "contact_surname")
private String surname;
@Column(name = "contact_phone_number")
private String phone;
}
@Entity(name = "assets")
@AttributeOverrides({
@AttributeOverride(name = "id", column=@Column(name="asset_id")),
@AttributeOverride(name = "refId", column=@Column(name="asset_ref_id"))
})
public class Asset extends BaseEntity {
@Column(name = "asset_location")
private String location;
}
@Entity(name = "accounts")
@AttributeOverrides({
@AttributeOverride(name = "id", column=@Column(name="account_id")),
@AttributeOverride(name = "refId", column=@Column(name="account_ref_id"))
})
public class Account extends BaseEntity {
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "contact_id", referencedColumnName = "contact_id")
private Contact contact;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "asset_id", referencedColumnName = "asset_id")
private Asset asset;
@Column(name = "account_code")
private String code;
}
还有@RestController,其中将发布Account 实例(待创建):
public interface AccountRepository extends CrudRepository<Account, Long> {
@Query("FROM accounts where account_code = :accountCode")
public Account findByCode(@Param("accountCode") String accountCode);
}
@RestController
@RequestMapping(value = "/accounts")
public class AccountController {
@Autowired
private AccountRepository accountRepository;
@RequestMapping(method = RequestMethod.POST)
public void createNewAccount(@RequestBody Account account) {
// Do some stuff maybe
accountRepository.save(account);
}
}
所以这里的想法是“Account JSON”将被发送到这个控制器,在那里它将被反序列化为Account 实例并(以某种方式)持久化到支持的 MySQL。我担心的是:Account 是几个其他实体的组合(通过外键)。我需要:
- 要么为这些实体中的每一个创建
CrudRepositoryimpls,然后编排对这些存储库的save(...)调用,以便在“外部”Account实体之前首先保存“内部实体”?或 - 我是否只保存
Account实体(通过AccountRepository.save(account)),Hibernate/JPA 会自动为我创建所有内部/依赖实体?
在这两种情况下,代码/解决方案会是什么样子?当BaseEntity#id 是数据库中的自动递增 PK 时,我们如何为它指定值?
【问题讨论】:
标签: java hibernate jpa spring-boot spring-data-jpa