【发布时间】:2022-01-27 15:31:19
【问题描述】:
我有两张桌子
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "car")
public class CarEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String name;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "manufacture_id")
private ManufactureEntity manufactureEntity;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "manufacture")
public class ManufactureEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
制造商表中已经有一个名为 AUDI 的条目。 当我尝试创建新记录时
ManufactureEntity manufactureEntity = new ManufactureEntity();
manufactureEntity.setName("AUDI");
CarEntity car = new CarEntity();
car.setName("a6");
car.setManufactureEntity(manufactureEntity);
carService.create(car);
然后我得到一个错误,这样的记录已经存在
org.postgresql.util.PSQLException: ERROR: Duplicate key value violates the "manufacture_name_key" uniqueness constraint
Details: The key "(name)=(AUDI)" already exists.
事实证明,对该函数的调用正试图向制造表添加一个新条目。 如何仅在不存在时才创建此记录,并且如果这样的记录已经存在,那么只需为manufacturer_id字段分配制造表中的键值?
- 添加新 CarEntity 记录时,如何指定其制造商实体字段将分配给制造商“AUDI”表中的现有记录?
- 但如果制造表中没有“AUDI”条目,则需要创建它。
还是不能同时实现?但只有一点。
还是我误解了 OneToOne 注释?汽车“a6”表中的一项仅对应于制造商“AUDI”表中的一项。让我们继续。汽车“a8”表中的一项仅对应于制造商“AUDI”表中的一项。还是我错了?而这里需要实现ManyToOne。
如果我将 OneToOne 注释更改为 ManyToOne,我会得到同样的错误
The key "(name)=(AUDI)" already exists.
如果我改变 CascadeType
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
添加到汽车表有效,但如果没有这样的记录,添加到制造表不起作用。 IE。当我指定特定制造商时
manufactureEntity.setId(1L);
然后写入汽车表不会出错。 但是如果我指定一个未知的制造商
manufacture Entity.setName("AUDIM");
然后我得到错误
NULL value in the "manufacture_id" column
使用 CascadeType.ALL 注解,只有在制造表中没有这样的记录时才起作用,如果有则不起作用。 使用 CascadeType.MERGE 注解,只有在制造表中有这样的条目时才有效,如果没有,则无效。
问题仍然悬而未决。 如何使汽车表中的条目和制造表中的条目起作用? 还是根本不可能,我需要先手动检查制造表中的现有记录,如果不存在,则添加它,然后写入汽车表?
【问题讨论】:
标签: spring-data-jpa