JPA/Hibernate:如何为 @ManyToOne 插入默认值,其中该值表示空条目

问题描述 投票:0回答:3

我对 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 基本上被用作空参数。

我的问题是,当我尝试将一个人保留到地址 ID = 0 的表中时,就会发生这种情况。

如果我将 Person 中的 Address 对象设置为 null,我会收到以下错误:

“addressId 不能为空”

如果我将地址对象的addressId设置为0,我会得到另一个transientObjectError,它被返回是因为地址表中没有addressId = 0的条目。

我尝试使用 @PrePersist 尝试在对象持久化之前尝试设置默认值,但是,我得到了上面相同的两个错误。当我在 @ManyToOne 中添加 optional=true 时也是如此。

我认为插入 id=0 的虚拟地址不是一个好主意。

如果可以使用 @ManyToOne 注释并且仍然具有默认值 0(其中 0 不是数据库中的实际条目),有什么想法吗?

hibernate jpa default-value many-to-one
3个回答
0
投票

如果你真的必须保留这些 0 而不是

null
也许你可以尝试使用 CustomType。请参阅此处:Hibernate 多对一外键默认 0


0
投票

我遇到了同样的问题,我使用 @NotFound 注释和操作

NotFoundAction.IGNORE
解决了它,如果关联实体不存在,它将返回 null。

示例:

import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

@ManyToOne
@NotFound( action = NotFoundAction.IGNORE )
private Module module;

0
投票

我也遇到同样的问题,我的解决方案是

@Entity
public class Person {
  @Id
  private Integer personId;

  private String name;

  @ManyToOne
  @JoinColumn(name="addressId")
  private Address address;

  public Address() {
    this.address = new Address();
    this.address.setId(-1);
  }

  public void getAddress() {
    if (this.address == null || this.address.id == -1) {
       return null;
    }
    return this.address;
  }
}

@Entity
public class Address {
  @Id
  private Integer addressId;

  private String address;
© www.soinside.com 2019 - 2024. All rights reserved.