- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常简单的 DB 模式,经典的 订单---(一对多)---> OrderItem <---(多对一)--- 产品
但是,当我使用 SchemaGen 生成 DDL 时,它会创建一个额外的层 orders_orders_item 和 product_orders_item ,实际上添加了一个冗余的关联表层:
create table orders (order_id bigint not null auto_increment, order_amout varchar(255), primary key (order_id)) engine=InnoDB;
create table orders_item (orders_item_id bigint not null auto_increment, order_amount integer, product_id bigint not null, primary key (orders_item_id)) engine=InnoDB;
create table orders_orders_item (OrderEntity_order_id bigint not null, orderItems_orders_item_id bigint not null) engine=InnoDB;
create table product (id bigint not null auto_increment, name varchar(255), price decimal(19,2), primary key (id)) engine=InnoDB;
create table product_orders_item (ProductEntity_id bigint not null, orders_orders_item_id bigint not null) engine=InnoDB;
似乎认为
之间存在多对多关联。订单和
订单项 ,以及
之间产品 和
orders_item .
@Entity
@Table(name = "orders")
public class OrderEntity {
@Id
@Column(name = "order_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany
private List<OrderItemEntity> orderItems;
protected OrderEntity() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public List<OrderItemEntity> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItemEntity> orderItems) {
this.orderItems = orderItems;
}
}
订单项目:
@Entity
@Table(name = "orders_item")
public class OrderItemEntity {
@Id
@Column(name = "orders_item_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "product_id", nullable = false, updatable = false)
private ProductEntity product = new ProductEntity();
@Column(name = "order_amount")
private int amount;
protected OrderItemEntity() {
}
public OrderItemEntity(ProductEntity product, int amount) {
super();
this.product = product;
this.amount = amount;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public ProductEntity getProduct() {
return product;
}
public void setProduct(ProductEntity product) {
this.product = product;
}
}
产品 :
@Entity
@Table(name = "product")
public class ProductEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany
private List<OrderItemEntity> orders = new ArrayList<>();
@Column(name = "name")
private String name;
@Column(name = "price")
private BigDecimal price;
protected ProductEntity() {
}
public ProductEntity(String name) {
this.name = name;
}
public ProductEntity(String name, BigDecimal price) {
super();
this.name = name;
this.price = price;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
最佳答案
orders_orders_item
表:@JoinColumn
,而不是只有一个外键,而是创建了一个带有两个外键的额外表。
orders_orders_item (OrderEntity_order_id, orderItems_orders_item_id)
要解决这个问题,您应该添加
@JoinColumn
注释到
OrderEntity
.
@Entity
@Table(name = "orders")
public class OrderEntity {
//...
@OneToMany
@JoinColumn(name = "order_id")
private List<OrderItemEntity> orderItems;
}
有了这个映射,只有一个
order_id
列将添加到
orders_item
table 。
orders_orders_item
不会不必要地创建表
product_orders_item
表:orders_item
之间存在双向关系和
product
.您指定了
@JoinColumn
在
orders_item
边。这导致了
product_id
的创建
orders_item
上的专栏表哪个是对的。
mappedBy
它是一个双向关系 DB 试图通过创建
product_orders_item
来建立链接。 table 。
mappedBy
归因于
orders
field 。
@Entity
@Table(name = "product")
public class ProductEntity {
// ...
@OneToMany (mappedBy="product")
private List<OrderItemEntity> orders = new ArrayList<>();
}
这说明已经在
product
之间创建了双向关系。和
orders_item
(无需映射
orders
字段)。不需要额外的表创建等。感谢
@JoinColumn
,
product_id
列是在
orders_item
中创建的 table 。
关于hibernate - SchemaGen 错误地生成了不必要的关联表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66302300/
我似乎无法弄清楚如何控制由 maven-jaxb-schemagen-plugin 创建的 XSD 文件的文件名。 documentation有点稀疏。 com.sun.tools.j
我有一个非常简单的 DB 模式,经典的 订单---(一对多)---> OrderItem orderItems; protected OrderEntity() { } pu
因为JAXB的schemagen工具不再是JDK 11的一部分,所以我想使用gradle设置一个项目,该项目通过可用的ant任务提供了schemagen工具的功能。 虽然,我让它运行ant任务的行为不
我有java类: public class ActivityAddress { @XmlElement(name = "Elem1", required = false) privat
我有两个顶级类(class),它们按组成共享第三个类(class)。示例: @XmlRootElement @XmlType(namespace = "http://example.com/foo")
我正在研究 Jaxb 2.x,并且能够将 XML 文档解码到 Java 组件中,但是当我尝试从现有的 java 类创建模式时,它不起作用。 我在 Google 的帮助下浏览了各个网站,但到目前为止还没
我正在尝试将现有的 Maven 项目迁移到 gradle 构建。在 Maven 项目中,我使用 jaxb2-maven-plugin 生成 xsd(schemagen)/classes(xjc)。我想
我实际上使用的是架构优先方法,但是我遇到了“不祥”的障碍 JAXB Map problem !并通过为此切换到代码优先方法来解决它。现在我想在其他模块中重用这种类型,并通过从生成的模式创建剧集文件来继
我正在使用 JAXB 从我的 Java 类生成 XML 架构,这样其他开发人员就可以在不了解 Java 的情况下轻松创建类的实例。 这是代码的相关部分: 包信息.java @XmlSchema(xml
如何从引用不同包中的枚举的 JAXB 对象生成模式? 下面是一个例子: 枚举类 package com.example.one public enum EnumExample { VALUE_
我有以下类结构: @XmlRootElement public class A{ private String s; private B b; //getter and setter } @XmlRo
我正在学习 JAXb 2.0,并且是新手。 我正在尝试使用 schemagen 基于 y POJO 类生成 XSD,对于简单的类,它工作正常,但是当我的类包含对其他类的引用时 schemagen 给我
我像这样注释了一个 XmlAdapter 类: @XmlTransient public class DateTimeXmlAdapter extends XmlAdapter { 但 schemag
我正在从事一个项目,该项目使用在多个文件上定义的多个本体。我希望使用 Jena 生成 java 类来帮助开发,但我似乎找不到让 Jena 处理多个文件作为 maven 目标的方法。 我以前从未通过 m
工具 schemagen.exe 从类生成 xsd 定义,例如结果是 当我在包级别放入 package-info.class 时: @XmlSchema(namespace = "aa/bb",
根据 Oracle 文档,schemagen 工具已作为 JEP 320 (http://openjdk.java.net/jeps/320) 的一部分从 JDK 中删除。该 JEP 指向现在提供缺失
我正在尝试使用 jaxb 从我现有的 POJO 类生成模式,到目前为止它工作正常,现在我有一个要求,我需要声明属性类型是我的 XSD,但属性值应该是预定义值之一。下面是我类(class)的代码快照 p
这与 No @XmlRootElement generated by JAXB 等问题的方向相反。 。基本上我想运行 schemagen 并拥有两个相同类型的全局元素。 我了解如何使用 JAXBE
如何防止 schemagen 将父类(super class)添加到架构中? 我已经尝试在父类(super class)及其字段上使用 XMLTransient,但它们仍然出现在架构中。 例如: @X
我想从 JAXB 注释类生成模式。为此,我正在使用 jaxb2-maven-plugin。该插件默认扫描 src/main/java 文件夹以查找包含的源。我想指定一个额外的文件夹来扫描不是 mave
我是一名优秀的程序员,十分优秀!