【发布时间】:2017-01-15 10:32:30
【问题描述】:
我尝试解决几年前在这里提到的相同问题: Hibernate many to many with a composite key with one field shared on either side of the relationship
我有一个 Menu 和一个 Item 类,并希望实现一个单向关系,即菜单保存它包含的所有项目。
因为当我声明复合键时,Hibernate 无法检索自动生成的 Id,并且 Id 在系统中是唯一的,所以我保存了没有额外 EmbeddedId PKClass 的实体:
@Entity
@Table(name="ITEM")
public class Item extends AbstractTimestampEntity{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="itemId", nullable=false)
private long itemId;
@ManyToOne
@JoinColumn(name="merchantId", nullable=false)
private Merchant merchant;
@Column(name="name", length=45)
private String name;
@Column(name="description" , length=200)
private String description;
@Column(name="price")
private double price;
public Item(){} // getters & setters
@Entity
@Table(name="MENU")
public class Menu {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="menuId", nullable=false)
private long menuId;
@ManyToOne
@JoinColumn(name="merchantId", nullable=false)
private Merchant merchant;
@Column(name="name", length=45)
private String name;
@ManyToMany
@JoinTable(name="MENU_ITEM", joinColumns = {
@JoinColumn(name="menuId", nullable=false, updatable=false)},
//@JoinColumn(name="merchant.merchantId", nullable=false, updatable=false)},
inverseJoinColumns = { @JoinColumn(name="itemId", nullable=false, updatable=false)})
// @JoinColumn(name="merchantId", nullable=false, updatable=false)})
private List<Item> items = new ArrayList<Item>(); // constructor, getters & setters
正如您从注释代码中看到的那样,这就是我提出问题的重点。如何在不修改规范化数据库表的情况下最好地映射实体? (他们需要有相同的商家在数据库中进行验证)
【问题讨论】:
-
你能显示
MENU_ITEM外键吗?
标签: java mysql hibernate foreign-keys many-to-many