2011-12-01 54 views
0

需要一些帮助了解我是否在正确的轨道上,以及我需要做什么。希望有人可以参加。需要关于将对象映射到数据库,注释和一对多关系的说明

所以我有三张表,Job,Authorization和Filter。每个作业必须有一个授权和一个过滤器。当然,每个过滤器可以被多个作业使用,授权也是如此。但是,过滤器和授权不需要知道他们正在使用的作业。

因此,这是一个过滤器和授权的一对多关系,我认为是正确的?或者我偏离轨道?这是如何在数据库中建模的?我相信Job表需要在过滤和授权表中有一个外键字段。过滤和授权表需要将外键字段本身用于Job吗?

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

class Filter { 

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

和Authorization类基本相同,那么Job类将如何显示?真正引起我兴趣的是Filter和Authorization类不需要任何关于它们关联的Job的知识,所以我没有看到它们需要实际持有对Job对象的引用。只有Job类需要保存对Filter和Authorization对象的引用。那么我真的需要上面的代码吗?

我希望有人可以帮助澄清这一切,因为我似乎无法包围我的头。数据库并不是我的强项。谢谢。

回答

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就是要显示在您的工作表的名称。默认情况下,如果您不指定连接çcolumn名称,它将是{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')

,这是它是如何会被放置在您工作表。

+0

这就是我的想法。正如我所说的,Job需要知道过滤器和授权,但不是其他方式,所以我希望我不需要在Filter或Authorization类中放置任何代码。所以ManyToOne是我想要的吗?谢谢。我很困惑,虽然我见过一些其他的东西。上述代码中的authorization_id列是否引用授权表或作业表中的列?外键在哪里?就在工作表中? – cardician

+1

authorization_id是hibernate将在Job表中为您创建的连接列的名称。您可能不会指定它,它会为您创建。此authorization_id字段将具有与Authorization对象中的相应主键完全相同的值。我会继续我的帖子。 –

+0

非常好,谢谢!最后一点,我不确定,我需要把外键放在数据库中?我假设我需要在我的数据库中创建一个实际的外键关系,那只是在Job表上? – cardician

1

其实,你应该使用many-to-one关系,从JobFilter,另一个从JobAuthorization

正如Hibernate文档中(见24.1. A note about collections)指出,从Filter一个one-to-many参考Job将使Job视为Filter实体,而这正是你想要的正好相反的一部分。所以,Job必须指向Filter。由于很多Job可能指向相同的Filter,这是一个many-to-one的关系。

你会写你的Job类是这样的:

public class Job { 

    ... 

    @ManyToOne 
    @JoinColumn(name="filter_fk") 
    private Filter filter; 

    @ManyToOne 
    @JoinColumn(name="authorization_fk") 
    private Authorization authorization; 

} 
+0

非常好的解释,谢谢。我仍然有一些困惑,所以我也会问你。您的代码中引用的filter_fk列在哪里?该列是否在Filter表或Job表中?我不清楚那部分,还有我在哪里放外键?在工作表上的权利?所以我会在Job表中创建一个包含ID并且是Filter表ID的外键的列?我的理解是否正确? – cardician

+0

这些列是在“Job”表中创建的。你不会“放”外键,Hibernate会照顾到这一点。 Hibernate把它放在'Job'表上。你理解正确。 – yair