Java 刷新单向实体时不为null约束冲突
我正在使用Java 刷新单向实体时不为null约束冲突,java,sql,oracle,spring-boot,hibernate,Java,Sql,Oracle,Spring Boot,Hibernate,我正在使用@OneToMany和@ManyToOne注释处理单向和双向映射,但在持久化实体并将其刷新到数据库中时,我无法突破单向映射的障碍 因此,两个表delivery\u company可能有许多delivery: SQL(Oracle): 单向映射: @Entity @Table(name = "Delivery") class DeliveryUniDirectional { @Id @SequenceGenerator(name = "del
@OneToMany
和@ManyToOne
注释处理单向和双向映射,但在持久化实体并将其刷新到数据库中时,我无法突破单向映射的障碍
因此,两个表delivery\u company
可能有许多delivery
:
SQL(Oracle):
单向映射:
@Entity
@Table(name = "Delivery")
class DeliveryUniDirectional
{
@Id
@SequenceGenerator(name = "delivery_id_sequence", sequenceName = "delivery_id_sequence", allocationSize = 1)
@GeneratedValue(generator = "delivery_id_sequence", strategy = GenerationType.SEQUENCE)
@Column(name = "delivery_id")
public Long deliveryId;
public BigDecimal price;
@Temporal(TemporalType.DATE)
public Date deliveryTime;
// setters, getters
}
@Entity
@Table(name = "delivery_company")
class DeliveryCompanyUniDirectional {
@Id
@Column(name = "delivery_company_id")
@SequenceGenerator(name = "delivery_company_id_sequence", sequenceName = "delivery_company_id_sequence", allocationSize = 1)
@GeneratedValue(generator = "delivery_company_id_sequence", strategy = GenerationType.SEQUENCE)
private Long deliveryCompanyId;
@Column(unique = true)
private String deliveryCompanyName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id", nullable = false, insertable = false, updatable = false)
private List<DeliveryUniDirectional> deliveries = new LinkedList<>();
// setters getters
}
我收到
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute batch ...
//
Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("TESTUSER"."DELIVERY"."DELIVERY_COMPANY_ID")
当entityManager.flush()时代码>
我尝试在deliverycompanyinidirectional
中使用@JoinColumn
,但在这种情况下,hibernate抱怨:
Error creating bean with name 'entityManagerFactory' defined in class path resource ...
// ...
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: wieczorek.jakub.shop.business.spring.model.domain.DeliveryUniDirectional column: delivery_id (should be mapped with insert="false" update="false")
显然,delivery
表中外键的notnull
约束存在问题。当我尝试使用双向映射时,持久化和刷新效果非常好,但我希望使用单向映射实现同样的效果
感谢阅读您的@join列应该是delivery\u company\u id
,因为它是您的外键
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="delivery_company_id", referencedColumnName="delivery_company_id", nullable = false)
private List<DeliveryUniDirectional> deliveries = new LinkedList<>();
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name=“delivery\u company\u id”,referencedColumnName=“delivery\u company\u id”,nullable=false)
私有列表传递=新建LinkedList();
我准备不同意Eklavya的观点,因为交货公司id是您所在表格中的一列。但这是因为我略过并意识到你没有遵循我认为是一种惯例:任何表中的ID列都只是名为ID,并且只有外键被命名为“id id”。当你做一个OneToMany注释时,连接列总是指向另一个表中的指向我的列。@ ZAG在POST中看到表创建SQL,更新到更清晰的版本,感谢@Eklayva提供了有效的解决方案(由于非空约束,我不得不添加nullable=false
)。感谢@Zag提供的有用评论。
Error creating bean with name 'entityManagerFactory' defined in class path resource ...
// ...
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: wieczorek.jakub.shop.business.spring.model.domain.DeliveryUniDirectional column: delivery_id (should be mapped with insert="false" update="false")
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="delivery_company_id", referencedColumnName="delivery_company_id", nullable = false)
private List<DeliveryUniDirectional> deliveries = new LinkedList<>();