2011-04-20 88 views
2

我有一个关于实体创建的问题。说我有以下各表JPA实体创建 - 对象与“基元”

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() { 
    } 

现在,当我去创建一个新的酒吧对象我也必须创建一个新的Foo对象。所以我创建了以下栏。请记住,我将setter和除默认构造函数外的所有实体都留在实体之外。

Bar bar1 = new Bar(1); 0121.jpg(“wheatly”); bar1.setFoo(new Foo(1));

相对于使用整数的字段类型的Foo:

酒吧BAR2 =新栏(1); bar2.setName(“GlaDOS”); bar2.setFoo(1);

我宁愿自己的第二种方法。有第一条路线更好的理由吗?我遇到的一个问题是解编XML我已经组合了实体和JAXB对象,并且在它们的情况下,Foo对象被设置为完全为空的Foo对象而不是ID为1的Foo对象。

您认为?

+0

请注意我知道一个Integer对象不是一个原始的,我只是不能想出一个更好的方式来描述它,对象和对象听起来不是helfpul。 – grantk 2011-04-20 17:14:25

+0

“包装类”如何? – AbdullahC 2011-04-20 17:18:26

回答

2

那么,它被称为对象关系映射:)。如果您没有发现JPA的附加功能比简单的JDBC封装更有价值,那么有更多的轻量级替代方法可以将数据库列值填充到对象中。

映射对象的第一件事就是让你自然地在JPQL中编写连接。您不能在JPQL中进行任意连接,必须将其定义为对象映射。

例如,如果你所有的酒吧是id的数值,并且你想找到一个有一定FOO你最终

select b from Bar b, Foo f where bar.fooId = f.id and f.name = :fooName; 

而如果你映射它正常的对象 - 引用的方式,你可以写

select b from Bar b where b.foo.name = :fooName; 

取决于你所使用的数据库,如果/以及它如何重写查询,在第一次查询的笛卡尔乘积可以是个坏消息。其次,如果不映射对象,则不能使用传递持久性。你回到使用EntityManager明确地导致每个单独的插入和更新,就好像它只是一个JDBC包装器一样。通过传递持久性(CASCADE设置)将所有显式持久化/合并插入/更新抽象到ORM层是JPA提供的比简单的JDBC包装器更重要的事情之一。

例如,如果你的标记与CascadeType.PERSIST酒吧的名单在@OneToMany,那么你可以通过这样做出新的吧:

beginTransaction(); 
Foo foo = em.find(Foo.class, 1); 
Bar newBar = new Bar(); 
//set up your Bar 
foo.getBarCollection().add(newBar); 
commitTransaction(); 

完成!

0

这似乎是你问是否使用整数对象或int数据类型。如果是这样,我会推荐int数据类型。当他们意识到将数值放入整数和双精度对象既是一个麻烦,也是对内存空间的浪费时,Java就想出了它们。一个对象是指一个位置,它存储了你放入它的所有值,从而允许你放入多个变量。数据类型只是存储数据。

+0

感谢您的回答,但我真的要问,使用Foo对象而不是代表该Foo对象的id值的整数对象 – grantk 2011-04-20 17:35:55

相关问题