如果我在这里正确的轨道以及我需要做什么,需要一些帮助。希望有人可以加入。
所以我有三个表,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对象的引用。所以我真的需要上面的代码吗?
我希望有人可以帮助我澄清这一切,因为我似乎无法绕过它。数据库不是我的强项。感谢。
答案 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
关系,Job
到Filter
以及Job
到Authorization
的另一个关系。
正如hibernate文档中所述(请参阅24.1. A note about collections),one-to-many
对Filter
的{{1}}引用会将Job
视为Job
的一部分{1}}实体,与您想要的完全相反。因此,Filter
必须指向Job
。由于许多Filter
可能指向相同的Job
,因此它是Filter
关系。
你用这种方式写你的many-to-one
课程:
Job