我仍然是Hibernate的新手,我仍处于陡峭的学习曲线上。 我有一个应用程序,将跟踪哪些人在哪个事件,反之亦然。我有一个通过连接表链接的事件类和人员类。
我有表单和帮助程序类,允许我在单独的Person和Event类中输入数据,保留它,搜索它,删除它,更改它并列出它。这都经过测试和运作。
当我向活动添加人员时,我可以列出所有活动并查看附加到活动的人员列表,但是当我输出人员列表时,他们都有一个大小为0的活动列表。
我的理解是,如果我将一个人附加到该人应该出现在Event.myPeople中的事件中,并且该事件应该出现在Person.eventList中。
显然我做错了,我怀疑它是在我的注释和声明中。我在下面列出了Event和Person类的集合。如果不对Hibernate有一个根本的误解,两者都有可能。从好的方面来说,我犯的错误越多,我学得越快。
知道我哪里错了吗?
@Entity
@Table(name = "PERSON")
public class Person implements Serializable {
@Id
@GeneratedValue
@Column(name = "person_id")
private int ID;
private String foreName;
private String surName;
@Temporal(javax.persistence.TemporalType.DATE)
private Date dob; //used to differentiate people with same name
@Temporal(javax.persistence.TemporalType.DATE)
private Date joinDate; //used to filter events outside active dates
@Temporal(javax.persistence.TemporalType.DATE)
private Date endDate; //used to filter events outside active dates
private Boolean active;
@ManyToMany()//cascade=CascadeType.ALL)
@JoinTable(name = "PERSON_EVENT", joinColumns = @JoinColumn(name = "person_id"),
inverseJoinColumns = @JoinColumn(name = "event_id"))
private Set<Event> eventList;
@OneToOne
private Sections mySection;
@Entity
@Table(name = "EVENT")
public class Event implements Serializable {
@Id
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
@Column(name="event_id")
private long id;
private String eventTitle;
private String eventDescription;
private String eventLocation;
@Temporal(javax.persistence.TemporalType.DATE)
private Date startDate;
@Temporal(javax.persistence.TemporalType.DATE)
private Date endDate;
@ManyToMany(cascade = CascadeType.ALL)
private Set<Person> myPeople;
@OneToMany(mappedBy = "myEvent")
private Set<EventType> type;
答案 0 :(得分:1)
问题必然是由于many to many
关联中缺少mappedBy字段。
除非关系是单向的,否则必须拥有该关系的字段。
我认为添加(mappedBy = eventList)
就足够了。
答案 1 :(得分:1)
关于Hibernate中的双向关系存在一种常见的误解。 Hibernate不关心对象树的一致性。如果事件与人之间存在双向关系,则必须自行将此人添加到事件和事件中。 Hibernate只保留你在内存中创建的内容。不要指望Hibernate将任何对象添加到任何集合中,这是业务逻辑的责任,它不应该依赖Hibernate才能正常工作。
现在,双向关系是特殊的,因为内存中的不一致状态甚至不能被持久化。对于一致的数据,Hibernate只需要保留一个双向关系的站点,因为另一个站点是(或应该是)冗余的。这是通过将一个部分标记为“反向”部分来完成的。 (对不起,我不知道注释映射语法是否足以指向映射中可能出现的错误。)“inverse”意味着Hibernate不再是“在同步到数据库时忽略”,因为它应该是多余的。
您仍然必须确保两个集合中的信息都是多余的。当您只将项添加到非反向集合时,它实际上“有效”。但是,不建议这样做,因为在保存并加载到新会话之前,对象将不一致。
还要确保使用相同的外键将双向关系映射到同一个表。我不知道注释映射是否会自动检测到这一点。
希望有所帮助。
答案 2 :(得分:0)
您可以尝试使用:@ManyToMany(fetch = FetchType.LAZY)