在我的Java EE 6的應用我的域模型中包含類似下面的雙向關係:JPA:的EclipseLink不持續的雙向關係數據庫
@Entity
public class Users implements PrimaryKeyHolder<String>, Serializable {
@Id
private String username;
@ManyToMany(mappedBy= "users")
private List<Category> categories;
public List<Category> getCategories() {
if (categories == null) {
categories = new ArrayList<Category>();
}
return Collections.unmodifiableList(categories);
}
public void addCategory(Category category) {
if (categories == null) {
categories = new ArrayList<Category>();
}
categories.add(category);
if (!category.getUsers().contains(this)) {
category.addUser(this);
}
}
public void removeCategory(Category category) {
if (categories == null) {
categories = new ArrayList<Category>();
}
categories.remove(category);
if (category.getUsers().contains(this)) {
category.removeUser(this);
}
}
public void setCategories(Collection<Category> categories) {
if (this.categories == null) {
this.categories = new ArrayList<Category>();
}
for (Iterator<Category> it = this.categories.iterator(); it.hasNext();) {
Category category = it.next();
it.remove();
if (category.getUsers().contains(this)) {
category.removeUser(this);
}
}
for (Category category : categories) {
addCategory(category);
}
}
}
@Entity
public class Category implements PrimaryKeyHolder<Long>, Serializable {
@Id
private Long id;
@ManyToMany
private List<User> users;
public List<User> getUsers() {
if (users == null) {
users = new ArrayList<User>();
}
return Collections.unmodifiableList(users);
}
protected void addUser(User user) {
if (users == null) {
users = new ArrayList<User>();
}
users.add(user);
}
protected void removeUser(User user) {
if (users == null) {
users = new ArrayList<User>();
}
users.remove(user);
}
}
更新:我添加關係管理代碼。關係僅在用戶端設置,因此,添加/刪除方法在Categoriy類中受到保護。我通過setCategories
在用戶上設置了類別。
Eclipselink正確地生成一個連接表CATEGORY_USERS。但是,它不會保留任何信息(它只會緩存信息)。例如。當我在實體管理器(例如用戶)上執行查找操作時,它會返回完整的對象圖(包括類別關係)。但是當我查看這些表時,信息不會更新(即使事務已提交)。我還在代碼中插入了刷新操作,但沒有成功。基本信息(如字符串,整數等欄)得到正確持續和更新。將日誌級別轉換爲FINE後,我可以看到沒有SQL語句分別針對關係表和連接表執行。但我確實看到了單向關係的SQL語句。
我的數據模型覆蓋了廣泛的單元測試,所有測試都通過了。我基本上在容器中執行相同的操作,提交事務,從數據庫重新加載實體並檢查關係是否正確設置,它們是什麼(我正在使用內存中的derby數據庫進行測試)。
我的應用服務器是Glassfish v3.1-b17。
任何幫助表示讚賞。 謝謝, Theo
很少有問題。你在找哪個實體?基本信息是什麼意思?順便說一句,你缺少'@ JoinColumn'註釋。 – 2010-10-22 09:33:24
我在找一個雙向關係的實體(例如在這個例子中的一個用戶)。通過基本信息,我指的是存儲在列中的類型(如字符串,整數等)。我更新了這個問題。感謝您指出了這一點。關於@JoinColumn:如果你忽略它,使用默認值,這是實體的PK。 – Theo 2010-10-22 09:48:56
請顯示一些(僞)代碼,生成的SQL – 2010-10-22 11:28:14