【问题标题】:ManyToMany cascade relationship alternative多对多级联关系替代
【发布时间】:2011-03-01 10:19:21
【问题描述】:

我有一个 Auction 和一个 Item 类,它们之间存在多对多关系。

public class Auction implements BaseEntity,Comparable<Auction>{
private static final long serialVersionUID = 1L;

@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "auction_id")
private Long auctionId; 

@Basic(optional = false)
@Column(name = "auction_name")
private String auctionName;

@ManyToMany
@JoinTable(name = "auction_items", joinColumns = {
    @JoinColumn(name = "auction_id", referencedColumnName = "auction_id")}, inverseJoinColumns = {
    @JoinColumn(name = "item_id", referencedColumnName = "item_id")})
private List<Item> itemList;
 .....}

public class Item implements BaseEntity{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="item_id")
private long itemId;

@Column(name="item_name")
private String itemName;
public class Item implements BaseEntity{
private static final long serialVersionUID = 1L;

@ManyToMany
@JoinTable(name="auction_items",joinColumns={@JoinColumn(name="item_id")},inverseJoinColumns={@JoinColumn(name="auction_id")})
private List<Auction> auctionList;
}

在创建新的拍卖时,有时我想选择一个现有的项目并与新的拍卖相关联,有时,我想创建一个新的项目。

如果我使用如图所示的 (cascade=CascadeType.ALL) 关系

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "auction_items", joinColumns = {
    @JoinColumn(name = "auction_id", referencedColumnName = "auction_id")}, inverseJoinColumns = {
    @JoinColumn(name = "item_id", referencedColumnName = "item_id")})
private List<Item> itemList;

然后,我将无法将现有项目与新拍卖实例相关联,如果我不使用这种级联关系,我将无法使用新拍卖创建新项目。

有人可以就提供这种灵活性的 Spring 的任何功能提供建议吗?

【问题讨论】:

    标签: hibernate jpa many-to-many cascade


    【解决方案1】:

    可以(并且应该)将多对多关系更改为一对多关系。拍卖应该能够包含许多物品,但在许多拍卖中拥有一件物品是没有意义的;您可能尝试的是在多次拍卖中拥有一个item-name。示例:

    您希望在许多拍卖中使用 item-name“汽车”,因为您有很多汽车要出售,但是将每辆汽车视为一个单独的实体,item-identity“Car37191”,那辆黑色奔驰只能参加一次拍卖。

    【讨论】:

    • 但是条件是这样的,我的实体之间需要多对多的关系,所以我可以有任何解决方案让我两者兼得,有时将现有项目附加到新的拍卖中(与级联不同)有时会通过新的拍卖创建新项目(如级联方式)。
    • 当然。通过静默实例化。在我的示例中,您将为每次拍卖实例化“Car”,但保留名称“Car”而不是更具体的名称。然后,您在每次拍卖中都有一个不同的对象,但由于它具有相同的名称,所以没有人会知道。
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 2016-08-07
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多