2011-04-20 72 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