Hibernate在两个字段上进行单向映射

时间:2018-02-12 16:49:40

标签: java hibernate

我有一个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;
    }

}

我想要达到的目的:物品只能放在背包里或装备好。不是两个。

1 个答案:

答案 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列表。