【发布时间】:2011-08-09 16:44:37
【问题描述】:
我有一个关于实体创建的问题。假设我有以下表格
create table "foo" (
"id" integer primary key,
"name" varchar
);
create table "bar" (
"id" integer primary key,
"name" varchar,
"fk_foo" integer references foo(id)
);
我想知道哪个最适合实体,在实体类中使用 foo 对象作为外键引用,还是在实体中使用整数。
使用 Netbeans 6.9 我生成了以下实体:
@Entity
@Table(name = "bar")
@NamedQueries({
@NamedQuery(name = "Bar.findAll", query = "SELECT b FROM Bar b"),
@NamedQuery(name = "Bar.findById", query = "SELECT b FROM Bar b WHERE b.id = :id"),
@NamedQuery(name = "Bar.findByName", query = "SELECT b FROM Bar b WHERE b.name = :name")})
public class Bar implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@JoinColumn(name = "fk_foo", referencedColumnName = "id")
@ManyToOne
private Foo foo;
public Bar() {
}
@Entity
@Table(name = "foo")
@NamedQueries({
@NamedQuery(name = "Foo.findAll", query = "SELECT f FROM Foo f"),
@NamedQuery(name = "Foo.findById", query = "SELECT f FROM Foo f WHERE f.id = :id"),
@NamedQuery(name = "Foo.findByName", query = "SELECT f FROM Foo f WHERE f.name = :name")})
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "foo")
private Collection<Bar> barCollection;
public Foo() {
}
现在,当我必须创建一个新的 Bar 对象时,我还必须创建一个新的 Foo 对象。所以我创建了以下栏。请记住,我将 setter 和除默认构造函数之外的所有构造函数都排除在实体之外。
酒吧 bar1 = 新酒吧 (1); bar1.setName("小麦"); bar1.setFoo(new Foo(1));
与对 Foo 使用整数字段类型相反:
酒吧 bar2 = 新酒吧 (1); bar2.setName("GlaDOS"); bar2.setFoo(1);
我自己更喜欢第二种方法。有没有理由选择第一条路线更好?我遇到的一个问题是在解组 XML 时,我已经组合了实体和 JAXB 对象,在这种情况下,Foo 对象被设置为完全为空的 Foo 对象,而不是 id 为 1 的 Foo 对象。
你怎么看?
【问题讨论】:
-
请注意,我知道 Integer 对象不是原始对象,我只是想不出更好的方式来描述它,对象 vs 对象听起来不适合。
标签: java netbeans entity jpa-2.0 netbeans-6.9