Java Hibernate多对多未完全更新

时间:2018-05-23 13:11:12

标签: java hibernate

我仍然是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;

3 个答案:

答案 0 :(得分:1)

问题必然是由于many to many关联中缺少mappedBy字段。

除非关系是单向的,否则必须拥有该关系的字段。

我认为添加(mappedBy = eventList)就足够了。

答案 1 :(得分:1)

关于Hibernate中的双向关系存在一种常见的误解。 Hibernate不关心对象树的一致性。如果事件与人之间存在双向关系,则必须自行将此人添加到事件和事件中。 Hibernate只保留你在内存中创建的内容。不要指望Hibernate将任何对象添加到任何集合中,这是业务逻辑的责任,它不应该依赖Hibernate才能正常工作。

现在,双向关系是特殊的,因为内存中的不一致状态甚至不能被持久化。对于一致的数据,Hibernate只需要保留一个双向关系的站点,因为另一个站点是(或应该是)冗余的。这是通过将一个部分标记为“反向”部分来完成的。 (对不起,我不知道注释映射语法是否足以指向映射中可能出现的错误。)“inverse”意味着Hibernate不再是“在同步到数据库时忽略”,因为它应该是多余的。

您仍然必须确保两个集合中的信息都是多余的。当您只将项添加到非反向集合时,它实际上“有效”。但是,不建议这样做,因为在保存并加载到新会话之前,对象将不一致。

还要确保使用相同的外键将双向关系映射到同一个表。我不知道注释映射是否会自动检测到这一点。

希望有所帮助。

答案 2 :(得分:0)

您可以尝试使用:@ManyToMany(fetch = FetchType.LAZY)