【发布时间】:2015-07-26 18:12:03
【问题描述】:
我对 JPA/Hibernate 还很陌生。我的问题涉及几个现有的数据库表,如下所示:
CREATE TABLE `person` (
`personId` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',
`addressId` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`personId`)
);
CREATE TABLE `address` (
`addressId` bigint(20) NOT NULL,
`address` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',
PRIMARY KEY (`addressId`)
);
实体是这样实现的:
@Entity
public class Person {
@Id
private Integer personId;
private String name;
@ManyToOne
@JoinColumn(name="addressId")
private Address address;
}
@Entity
public class Address {
@Id
private Integer addressId;
private String address;
}
多个人可以住在同一个地址。一个人也可以没有地址。 person 表中的 addressId 本质上是一个可选字段。 地址数据库中没有addressId = 0。值 0 基本上就像它是一个空参数一样使用。
我的问题是当我尝试将一个人持久保存到 addressId = 0 的表中时发生这种情况。
如果我将 Person 中的 Address 对象设置为 null,我会收到以下错误:
"addressId 不能为空"
如果我将地址对象的 addressId 设置为 0,我会得到另一个瞬态对象错误,因为地址表中没有 addressId = 0 的条目。
我尝试使用@PrePersist 尝试在对象被持久化之前设置默认值,但是,我得到了上面相同的两个错误。当我在 @ManyToOne 中添加 optional=true 时也是如此。
我不认为插入一个 id=0 的虚拟地址是个好主意。
如果可以使用 @ManyToOne 注释并且仍然具有默认值 0,其中 0 不是数据库中的实际条目,有什么想法吗?
【问题讨论】:
标签: hibernate jpa default-value many-to-one