我已阅读关于多对多关系的 Hibernate文档 ,并尝试按照他们的建议进行操作,但我的解决方案并不成功。希望有人能够为这个问题提供一些指导。
我有一个数据库结构,我正在尝试通过Hibernate映射多对多关系。这个想法是我有许多可能会互相产生冲突的实体。在表结构上,每个实体都类似,因此我从一个公共持久化类
这里是实体声明。我已经包括
我的类和Hibernate配置:
在代码中,我需要能够从任一方面创建连接表条目(将AbstractEntity添加到Conflict或将Conflict添加到AbstractEntity)。下面展示了我创建示例的一个示例:
Hibernate似乎知道发生了什么,所以我觉得我可能错过了一些简单的东西。当我创建一个新的“冲突”并将“AbstractEntity”添加到其中时,会创建Conflict和AbstractEntity,但连接表保持为空。有人能给我提供线索,告诉我需要做什么才能让Hibernate填充空白的连接表吗?
我有一个数据库结构,我正在尝试通过Hibernate映射多对多关系。这个想法是我有许多可能会互相产生冲突的实体。在表结构上,每个实体都类似,因此我从一个公共持久化类
AbstractEntity
中抽象出它们。由于实体之间可能存在冲突,并且可以与任意数量的其他实体发生冲突,因此我定义了一个单独的Conflict
Hibernate实体来定义每个冲突,这应该通过多对多关系映射到在该冲突中的每个实体。这里是实体声明。我已经包括
Event
作为AbstractEntity
对象的具体实现的示例。我的类和Hibernate配置:
@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似乎知道发生了什么,所以我觉得我可能错过了一些简单的东西。当我创建一个新的“冲突”并将“AbstractEntity”添加到其中时,会创建Conflict和AbstractEntity,但连接表保持为空。有人能给我提供线索,告诉我需要做什么才能让Hibernate填充空白的连接表吗?
PERSIST
和MERGE
默认已经配置好了。我也尝试了指定ALL
,但是还是没有运气。我编辑了问题,包括我正在使用的提交新 Conflict 的代码。 - shawmanz32na