【问题标题】:hibernate one to many single direction休眠一对多单方向
【发布时间】:2013-04-30 18:53:12
【问题描述】:

我正在尝试制作一些休眠的东西并根据休眠注释自动创建 sql 脚本。这是我所拥有的:

课程安排:

@Entity
@Table(name = ScheduleTableConsts.TABLE_NAME)
public class Schedule implements Serializable {

@Id
@Column(name = ScheduleTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = ScheduleSlotTableConsts.ID_COLUMN)
private List<ScheduleSlot> scheduleSlots;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = LessonTableConsts.ID_COLUMN)
private List<Lesson> lessons;  

Constructors, getters, setters...

ScheduleSlot 类:

@Entity
@Table(name = ScheduleSlotTableConsts.TABLE_NAME,
       uniqueConstraints = {@UniqueConstraint(columnNames = {TimeSlotTableConsts.ID_COLUMN,
                                                             PlaceSlotTableConsts.ID_COLUMN})})
public class ScheduleSlot implements Serializable {
@Id
@Column(name = ScheduleSlotTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@OneToOne
@JoinColumn(name = TimeSlotTableConsts.ID_COLUMN)
private TimeSlot timeSlot;

@OneToOne
@JoinColumn(name = PlaceSlotTableConsts.ID_COLUMN)
private PlaceSlot placeSlot;  

Constructors, getters, setters...  

课程类别:

@Entity
@Table(name = LessonTableConsts.TABLE_NAME)
public class Lesson implements Serializable {

@Id
@Column(name = LessonTableConsts.ID_COLUMN)
@GeneratedValue(strategy = GenerationType.AUTO)
private int            id;

@OneToMany(fetch = FetchType.LAZY)
private Set<Professor> professors;

@OneToMany(fetch = FetchType.LAZY)
private Set<Course>    courses;

@OneToMany(fetch = FetchType.LAZY)
private Set<Group>     groups;

@Column(name = LessonTableConsts.LAB_COLUMN)
private boolean        lab;  

Constructors, getters, setters...

我想要实现的是让时间表知道它的时段和课程,而不是让时段和课程知道它们所属的时间表。上面的代码似乎没问题,但是当我尝试生成 sql 脚本(为此目的使用 maven 和 hibernate3-maven-plugin)并运行它时,会发生以下情况:

  1. 它创建一个没有指向 SCHEDULESLOT 或 LESSON 表的指针的 SCHEDULE 表;
  2. 它创建没有指向 SCHEDULE 表的指针的 SCHEDULESLOT 和 LESSON 表。

有人可以告诉我我做错了什么吗?

提前致谢!

【问题讨论】:

    标签: java hibernate maven hbm2ddl


    【解决方案1】:

    有一件事你忘记注意了:

    使用@OneToMany注解时,不能简单地使用@JoinColumn。但是,另一方面,我的意思是@ManyToOne:你可以使用@JoinColumn

    您应该清楚为什么这是这样,而不是相反。 (一个实体如何在一列中保留这么多 ID?)

    所以你有两个选择:
    1) 使用特定表来存储您的OneMany 实体之间的关系。像这样的:

    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "SCHEDULE_SLOTS_MAPPING", joinColumns = @JoinColumn(name = "SCHEDULE_ID"), inverseJoinColumns = @JoinColumn(name = "SCHEDULE_SLOT_ID"))
    private List<ScheduleSlot> scheduleSlots;
    

    2) 在关系的Many 端使用@JoinColumn:(例如您的ScheduleSlot 类)

    @ManyToOne
    @JoinColumn(name="SCHEDULE_ID")
    private Schedule schedule;
    

    【讨论】:

    • 在第 2 点)中,您应该将 mappedBy 子句添加到 Schedule 中的 @OneToMany。例如。 @OneToMany(cascade=CascadeType.ALL, mappedBy=ScheduleSlotTableConsts.ID_COLUMN) 私有列表 scheduleSlots;
    • 这不是强制性的。如果我们希望双方都可以访问,那么您的主张是正确的。否则,根本没有。尽管如此,它与问题无关。是否使用mappedBy 不会改变其有效性。
    • 同意。我假设发布者希望根据他的原始帖子访问列表。
    • 哦,现在我明白了。谢谢,@MatinKh!我在休眠方面并没有真正的经验,你的回答让我明白了很多事情。再次感谢!
    猜你喜欢
    • 2012-06-22
    • 2013-05-23
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多