我有一个Creature类和Item Class:
我需要在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创建了额外的表:
| Creature_id | itemsInBackpack_id | equipItems_id |
这对我来说没问题。但问题是itemsInBackpack_id和equippedItems_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;
}
}
我想要达到的目的:物品只能放在背包里或装备好。不是两个。
答案 0 :(得分:1)
您可能想要制作两个单独的映射表。您可以使用@JoinTable
annotation控制您的表格。所以将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
}
然后,您的生物可以只有一个Item
列表,而不是两个EquippableItem
列表。