我有,我很高興與現有的數據模型:使用JPA註解使用Hibernate來形容@OneToMany關係,其中外鍵只在子表
public class Garden {
private String name; // "Oak Grove"
private List<Plant> plants;
}
public class Plant {
private String name; // "Cherry Tomato"
}
我想在Hibernate中映射此符合下列條件:
的
Plant
類在Java中不維護其父Garden
參考。這使得Java層,IMO中的事情變得更加困難。PLANT
表應該有一個GARDEN_ID
列,它是GARDEN(ID)
列的外鍵。
我的初始設置中,除了@OneToMany
之前:
@Entity(name = "GARDEN")
public class Garden {
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "NAME", nullable = false)
private String name; // "Oak Grove"
// Not yet mapped
private List<Plant> plants;
}
@Entity(name = "PLANT")
public class Plant {
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "NAME", nullable = false)
private String name; // "Cherry Tomato"
}
我怎麼能以這樣的方式外鍵參考保持在Plant
定義的List<Plant> plants;
的@OneToMany
註解?
如果我再補充:
@OneToMany(cascade = { CascadeType.ALL })
@JoinColumn(name = "GARDEN_ID")
private List<Plant> plants;
然後保存與植物花園未能像這樣:
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "GARDEN_ID"; SQL statement:
insert into PLANT (NAME, ID) values (?, ?) [23502-191]
如此看來休眠是不是要堅持外鍵。有沒有辦法做到這一點,而不是完全扼殺我的對象模型?
編輯:我測試這一問題的方法是:
Garden garden = new Garden("Oak Grove");
garden.addPlant(new Plant("Cherry Tomato"));
gardenManager.save(garden);
其中save()
方法看起來非常休眠安永:
public void save(T item) {
try (Session session = factory.openSession()) {
Transaction transaction = session.beginTransaction();
try {
session.saveOrUpdate(item);
transaction.commit();
} catch (Exception ex) {
System.out.println("Error occurred saving item: " + ex.getMessage());
ex.printStackTrace();
transaction.rollback();
}
}
}
你有沒有嘗試刪除@JoinColumn和添加的mappedBy到@OneToMany?@OneToMany(cascade = CascadeType.ALL, mappedBy =「garden」) – RubioRic
@Nicholas Code添加。 –
@RubioRic這是我的理解是,'mappedBy'是在孩子('Plant')類上有相應的Java屬性('private Garden garden')時使用的 - 這不是我想要完成的。 –