需要澄清将对象映射到数据库,注释以及一对多关系

时间:2011-12-01 19:46:36

标签: java database hibernate annotations persistence

如果我在这里正确的轨道以及我需要做什么,需要一些帮助。希望有人可以加入。

所以我有三个表,Job,Authorization和Filter。每个作业必须有一个授权和一个过滤器。当然,每个过滤器可以由多个作业使用,同样适用于授权。但是,过滤器和授权不需要知道他们正在使用哪些作业。

这是过滤器和授权方面的一对多关系我认为对吗?还是我偏离轨道?这是如何在数据库中建模的?我相信Job表需要在Filter和Authorization表中有一个外键字段。过滤和授权表是否需要外键字段本身到Job?

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

class Filter {

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

和Authorization类基本相同,那么Job类看起来如何?真正让我失望的是,过滤器和授权类不需要知道他们与哪些Job相关联,因此我认为他们不需要实际持有对Job对象的引用。只有Job类需要保存对Filter和Authorization对象的引用。所以我真的需要上面的代码吗?

我希望有人可以帮助我澄清这一切,因为我似乎无法绕过它。数据库不是我的强项。感谢。

2 个答案:

答案 0 :(得分:1)

据我所知,在你的情况下不推荐使用@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表中显示的名称。默认情况下,如果您没有指定连接çolumn名称,那么它将是{foreignTableName} _id。在Authorizatrion的情况下,如果你这样注释:

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

在Job表中为您生成的默认连接列将是

"foo_id"并将引用

中的

"auth_id"字段

"foo"表。

致你的最终评论:

实际上你不需要将外键放入db中。在工作实体中,

@ManyToOne注释已经确保将为您设置密钥

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

  

@JoinColumn('authorization_fk')

这就是如何将它放在你的工作表中。

答案 1 :(得分:1)

实际上,您应该使用many-to-one关系,JobFilter以及JobAuthorization的另一个关系。

正如hibernate文档中所述(请参阅24.1. A note about collections),one-to-manyFilter的{​​{1}}引用会将Job视为Job的一部分{1}}实体,与您想要的完全相反。因此,Filter必须指向Job。由于许多Filter可能指向相同的Job,因此它是Filter关系。

你用这种方式写你的many-to-one课程:

Job