【发布时间】:2014-02-18 20:37:20
【问题描述】:
我已阅读有关多对多关系的Hibernate Documentation,并尝试遵循他们的建议,但我的解决方案并未成功。希望有人能对这个话题有所了解。
我有一个数据库结构,我试图在其中通过 Hibernate 映射多对多关系。这个想法是我有许多可能相互冲突的实体。在表结构方面,这些实体中的每一个都是相似的,所以我将它们从一个公共的持久类中抽象出来,AbstractEntity。由于实体可能发生冲突,并且可能与任何数量的其他实体发生冲突,我定义了一个单独的Conflict Hibernate 实体来定义每个冲突,这些冲突应该通过多对多关系映射到该冲突中的每个实体。
这里是实体声明。我已将Event 作为AbstractEntity 对象的具体实现的示例。
我的类和休眠配置:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEntity {
protected Set<Conflict> conflicts = null;
protected AbstractEntity() {
conflicts = new HashSet<Conflict>();
}
@ManyToMany(fetch = FetchType.LAZY,
targetEntity = Conflict.class)
@JoinTable(name = "conflict_affected_entity",
joinColumns = { @JoinColumn(name = "affected_entity_id") },
inverseJoinColumns = { @JoinColumn(name = "conflict_id") })
public Set<Conflict> getConflicts() {
Hibernate.initialize(conflicts);
return conflicts;
}
public void setConflicts(Set<Conflict> conflicts) {
this.conflicts.clear();
this.conflicts.addAll(conflicts);
}
}
@Entity
@Table(name = "event")
public class Event extends AbstractEntity {
private String name;
public Event() {
super();
}
@Column(name = "name", nullable = false)
public String getName() {
return name;
}
public void setName(String text) {
this.name = text;
}
}
@Entity
@Table(name = "conflict")
public class Conflict {
private Set<AbstractEntity> affectedEntities = null;
public Conflict() {
affectedEntities = new HashSet<AbstractEntity>();
}
@ManyToMany(fetch = FetchType.LAZY,
targetEntity = AbstractEntity.class,
mappedBy = "conflicts")
public Set<AbstractEntity> getAffectedEntities() {
Hibernate.initialize(affectedEntities);
return affectedEntities;
}
public void setAffectedEntities(Set<AbstractEntity> affectedEntities) {
this.affectedEntities.clear();
this.affectedEntities.addAll(affectedEntities);
}
}
在代码中,我需要能够从任一侧创建连接表条目(将 AbstractEntity 添加到 Conflict 或将 Conflict 添加到 AbstractEntity)。此处显示了我如何创建示例的示例:
Event event1 = EventDAO.getInstance().get(eventID1);
Event event2 = EventDAO.getInstance().get(eventID2);
Conflict conflict = new Conflict();
conflict.getAffectedEntities().add(event1);
conflict.getAffectedEntities().add(event2);
Hibernate 似乎对正在发生的事情有一个线索,所以我觉得我错过了一些简单的东西。当我创建一个新的Conflict 并向其中添加一个AbstractEntity 时,会创建 Conflict 和 AbstractEntity,但连接表仍然为空。谁能给我一个线索,让我知道我需要做什么才能让 Hibernate 填充空白的连接表?
【问题讨论】:
-
您的级联设置是什么?您调用的是哪些实体保存?使用如上所示的代码,我很惊讶抽象实体在添加到冲突实体时仍然存在,因为它似乎没有在关系上设置级联?
-
@Hedley - 看起来 Hibernate 文档指定
PERSIST和MERGE是默认配置的。我也尝试过指定ALL,但仍然没有运气。我编辑了问题以包含我用来提交新冲突的代码
标签: java hibernate inheritance hibernate-annotations