gpt4 book ai didi

java - Hibernate 映射理解

转载 作者:行者123 更新时间:2023-12-01 11:55:27 25 4
gpt4 key购买 nike

我在理解 hibernate 如何双向映射集合时遇到了一些问题。

通缉以下人员:表架构:

事件(e_id、日期、i_id)

信息(i_id,详细描述)

我有多个事件和一些信息对象,它们汇总了 x 事件的详细信息。作为对象,我有不同的事件对象和一些应包含事件对象列表的信息对象。与信息对象相关的事件对象应该有一个关联的信息对象,请参阅下面的类信息。

@Entity
@Table(name = "info")
public class Info {
@Id
@GenericGenerator(name = "gen", strategy = "increment")
@GeneratedValue(generator = "gen")
@Column(name = "i_id")
private long id;

@JoinTable(name = "events",
joinColumns = @JoinColumn(name = "e_id"),
inverseJoinColumns = @JoinColumn(name = "i_id"))
@OneToMany(targetEntity = Event.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Event> events;

String detailDesc;

}


@Entity
@Table(name = "event")
public class Event {
@Id
@GenericGenerator(name = "gen", strategy = "increment")
@GeneratedValue(generator = "gen")
@Column(name = "e_id")
private long id;

// Can be NULL
@ManyToOne(targetEntity = Info.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "i_id")
private Info info;

private Date date;

}

现在,hibernate 说重复条目或外键约束失败(event,CONSTRAINT FK_r9sdjn6nelyo5be86vu0b2prs FOREIGN KEY (e_id) REFERENCES 信息 (i_id))

最佳答案

您的映射不正确。根据您的架构,您没有使用 JoinTable,因此因此在 @ManyToOne 一侧设置 @JoinColumn (如您所拥有),并在相反一侧简单地使用 'mappedBy' 。确保关系双方均已设置,以确保级联按预期工作。

如果您确实想使用连接表(而不是来自 event > info 的 FK),那么您可以将现有的 @JoinTable 移动到 @ManyToOne 并删除 @JoinColumn。无论您使用@JoinTable还是@JoinColumn,反面都将保持如下。

@Entity
@Table(name = "info")
public class Info {

@Id
@GenericGenerator(name = "gen", strategy = "increment")
@GeneratedValue(generator = "gen")
@Column(name = "i_id")
private long id;


@OneToMany(mappedBy="info" cascade = CascadeType.ALL)
private List<Event> events;

String detailDesc;

//set both sides of the relationship
public void addEvent(Event event){
event.setInfo(this);
events.add(event);
}

public List<Event> getEvents(){
//return unmodifiable list or iterator to force clients through addEvent() method
}

}


@Entity
@Table(name = "event")
public class Event {
@Id
@GenericGenerator(name = "gen", strategy = "increment")
@GeneratedValue(generator = "gen")
@Column(name = "e_id")
private long id;

@ManyToOne(cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "i_id")
private Info info;

private Date date;

}

关于java - Hibernate 映射理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28485052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com