gpt4 book ai didi

java - JPA ManyToMany Join Table 具有作为 PK 的所有属性

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:35:18 24 4
gpt4 key购买 nike

我正在使用 Hibernate 3.3.1 并且正在跟随建模 this sample table structure ,但我在创建具有额外属性的连接表时遇到了问题。

它是OrderProduct 表之间的多对多关系。连接表是 Order Detail 表。我按照提到的方法 here .

现在我有了实体

@Entity
@Table(name = "Orders")
public class Order {
@OneToMany(mappedBy="order")
private List<OrderDetail> orderItems;
}

@Entity
@Table(name="PRODUCTS")
public class Product {
@OneToMany(mappedBy="product")
private List<OrderDetail> orderItems;
}

@Entity
@IdClass(OrderDetail.class)
@Table(name = "ORDER_DETAIL")
public class OrderDetail implements Serializable {
@Id
@Column(name="ORDER_ID")
private Long orderId;
@Id
@Column(name="PRODUCT_ID")
private Long productId;

@Column(name = "PRICE")
private double price;

@Column(name = "LAST_UPDATED_TIME")
private Date lastUpdatedTime;

@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;

@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}

public class OrderDetailId implements Serializable {
private Long orderId;
private Long productId;
}

我使用 Apache Derby 进行了测试,但我在生成的表结构方面遇到了问题。

CREATE TABLE ORDER_DETAIL (
PRODUCT_ID BIGINT NOT NULL,
ORDER_ID BIGINT NOT NULL,
LAST_UPDATED_TIME TIMESTAMP NOT NULL,
PRICE DOUBLE NOT NULL
);

CREATE INDEX SQL120323142938020 ON ORDER_DETAIL (PRODUCT_ID ASC);

CREATE UNIQUE INDEX SQL120323142937810 ON ORDER_DETAIL (PRODUCT_ID ASC, ORDER_ID ASC, LAST_UPDATED_TIME ASC, PRICE ASC);

ALTER TABLE ORDER_DETAIL ADD CONSTRAINT SQL120323142937810 PRIMARY KEY (PRODUCT_ID, ORDER_ID, LAST_UPDATED_TIME, PRICE);

ALTER TABLE ORDER_DETAIL ADD CONSTRAINT FK4A94AA82CC6D989A FOREIGN KEY (PRODUCT_ID)
REFERENCES PRODUCTS (PROD_ID);

它似乎已经创建了我所有的列作为主键。为什么会这样?

最佳答案

您使用实体的类作为 IdClass 的参数。那是不正确的。应使用 Id 类。此外,不需要在连接实体中为 id 单独字段。

寻找类似下面的代码。我不能保证它能在这么旧的 Hibernate 版本中工作,但肯定能在任何版本的 Hibernate 中工作。无论如何都值得一试。如果您想使用 JPA 2.0 功能,至少更新到 3.5.X 版本(或者更新鲜的版本)不会有什么坏处。构造函数/等于等被剥离以节省空间。

@Entity
@Table(name = "Orders")
public class Order {
@Id Long id;
@OneToMany(mappedBy="order")
private List<OrderDetail> orderItems;
}

@Entity
@Table(name="PRODUCTS")
public class Product {
@Id Long id;
@OneToMany(mappedBy="product")
private List<OrderDetail> orderItems;
}

@Entity
@IdClass(OrderDetailId.class)
@Table(name = "ORDER_DETAIL")
public class OrderDetail implements Serializable {
@Id @ManyToOne @JoinColumn(name = "ORDER_ID")
private Order order;

@Id @ManyToOne @JoinColumn(name = "PRODUCT_ID")
private Product product;

@Column(name = "PRICE") private double price;
//Maybe you also want to use @TemporalType here
@Column(name = "LAST_UPDATED_TIME") private Date lastUpdatedTime;
}

public class OrderDetailId implements Serializable {
private Long order;
private Long product;
}

2017 年 8 月 15 日更新在 JPA 2.1 及更高版本中,您不需要为复合 Id 添加类,您可以这样做:

@Entity
@Table(name = "ORDER_DETAIL")
public class OrderDetail implements Serializable {
@Id @ManyToOne @JoinColumn(name = "ORDER_ID")
private Order order;

@Id @ManyToOne @JoinColumn(name = "PRODUCT_ID")
private Product product;

@Column(name = "PRICE") private double price;
//Maybe you also want to use @TemporalType here
@Column(name = "LAST_UPDATED_TIME") private Date lastUpdatedTime;
}

关于java - JPA ManyToMany Join Table 具有作为 PK 的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9835124/

24 4 0