gpt4 book ai didi

java - Hibernate 在两个字段上的单向映射

转载 作者:行者123 更新时间:2023-12-02 11:38:25 25 4
gpt4 key购买 nike

我有一个生物类和元素类:

我需要在 Creature 中进行单向映射,如下所示:

@Entity
public class Creature {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@OneToMany(cascade = CascadeType.ALL)
private List<Item> equippedItems;

@OneToMany(cascade = CascadeType.ALL)
private List<Item> itemsInBackpack;

//getters/setters
}

Hibernate 创建附加表:

|生物 ID | itemsInBackpack_id | 背包中的元素EquipmentItems_id |

这对我来说很好。但问题是 itemsInBackpack_id 和 EquipmentItems_id 都将 nullable 设置为 false。这会导致以下异常:

Caused by: java.sql.SQLException: Field 'itemsInBackpack_id' doesn't have a default value

如何告诉 Hibernate 在这些列上允许空值?

编辑:

这就是我保存它的方式:

Item item1 = new Item();
Item item2 = new Item();

creature.getEquippedItems().add(item1);
creature.getItemsInBackpack().add(item2);

repository.save(creature);

编辑

项目类别:

@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

public long getId() {
return id;
}

}

我想要实现的目标:元素只能放在背包或装备中。两者都不是。

最佳答案

您可能想要创建两个单独的映射表。您可以使用@JoinTable annotation来控制您的 table 。 。因此,将 Creature 的代码修改为类似

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name="CREATURE_EQUIPPED_ITEM")
private List<Item> equippedItems;

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name="CREATURE_INVENTORY_ITEM")
private List<Item> itemsInBackpack;

这将创建两个单独的表,因此您不必担心列为空。更好的方法可能是有一个“itemEquipped”标志表,例如:

@Entity
public class EquippableItem{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column
private boolean isEquipped;

@Column
private Item item;


//getters and setters
}

然后,您可以只拥有一个 EquippableItem 列表,而不是为您的生物提供两个 Item 列表。

关于java - Hibernate 在两个字段上的单向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com