需要一些帮助,以了解我是否在正确的轨道上以及我需要做什么。希望有人能发出声音。

所以我有三个表,Job,Authorization和Filter。每个作业必须具有一个授权和一个过滤器。当然,每个筛选器可以由多个作业使用,并且授权也一样。但是,过滤器和授权不需要知道它们正在使用什么作业。

因此,我认为过滤器和授权之间存在一对多的关系吗?还是我偏离了轨道?如何在数据库中建模?我认为Job表需要具有Filter和Authorization表的外键字段。筛选表和授权表是否需要外键字段本身用于Job?

接下来,如何在Java对象中对此建模,然后如何设置休眠或Java持久性注释?我相信Filter类看起来像:

class Filter {

    @OnetoMany
    @JoinColumn(name="filterID")
    private Job job;
}


与Authorization类基本相同,然后Job类的外观如何?真正让我烦恼的是,Filter和Authorization类不需要任何与它们关联的Job相关的知识,因此我看不到它们实际持有对Job对象的引用的必要。只有Job类需要保存对Filter和Authorization对象的引用。那我真的需要上面的代码吗?

我希望有人可以帮我澄清所有这一切,因为我似乎无法解决这个问题。数据库不是我的强项。谢谢。

最佳答案

据我所知,在您的情况下不建议使用@OneToMany批注。也许您可能希望对方拥有该关系。

查看这篇文章:
http://josian.wordpress.com/2006/09/09/hibernate-annotations-bidirectional-one-to-many/

因此,对于您的问题,不,您不需要上面的代码。

您需要这样的东西:

class Job {

    @Id
    //stuff...


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn (name="authorization_id", nullable = false, updatable = false, insertable = false)
    private Authorization authorization;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn (name="filter_id", nullable = false, updatable = false, insertable = false)
    private Filter filter;
}


在你的过滤器上

@Entity
@Table(name="filter")
class Filter {

      //some stuff, but no relation!
}


编辑:
@JoinColumn只是您要显示在Job表中的名称。默认情况下,如果您不指定连接的名字,它将是{foreignTableName} _id。对于Authorizatrion,如果您这样注释:

@Entity
@Table(name="foo")
class Authorization{
 @Id
 @column(name="auth_id")
 private Long authId;
}


在“作业”表中为您生成的默认联接列为

"foo_id"并将引用

"auth_id"字段

"foo"表。

对您的最终评论:

实际上,您不需要在数据库中放置外键。在工作实体中,

@ManyToOne注释已经确保可以为您放置密钥。的

@JoinColumn指定外键的名称。例如,如果您希望“作业”表中要授权的外键名称称为“ authorization_fk”,则可以使用


  @JoinColumn('authorization_fk')


这就是将其放置在工作表中的方式。

09-04 03:47
查看更多