簡體   English   中英

如何使用Hibernate保存復雜對象?

[英]How to save complex objects using Hibernate?

我有三張桌子:

CREATE TABLE catalog (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    type_id INT,
    genre_id INT,
    product_name VARCHAR(100),
    FOREIGN KEY ( genre_id ) REFERENCES genres ( genre_id ),
    FOREIGN KEY ( type_id ) REFERENCES types ( type_id )
);

CREATE TABLE genres (
    genre_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    genre_name VARCHAR(50)
);

CREATE TABLE types (
    type_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    type_name VARCHAR(50)
);

我也有Java課程

@Entity
@Table(name = "catalog", catalog = "media_store_db")
public class Catalog implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "product_name", length = 100)
    private String productName;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "genre_id", referencedColumnName = "genre_id")
    private Genre genre;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "type_id", referencedColumnName = "type_id")
    private Type type;


@Entity
@Table(name = "genres", catalog = "media_store_db")
public class Genre implements Serializable {

    @Id
    @Column(name = "genre_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "genre_name")
    private String name;

@Entity
@Table(name = "types", catalog = "media_store_db")
public class Type implements Serializable {

    @Id
    @Column(name = "type_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "type_name")
    private String name;

是否可以像這樣保存(使用Hibernate Session的save()方法)Catalog對象

Catalog catalog = new Catalog();
catalog.setProductName("Product");
catalog.setGenre(new Genre());
catalog.setType(new Type());
save(catalog);

沒有寫SQL? 我需要做什么類型和類型? 我應該設置兩個實例的ID嗎?

UPD:

這段代碼工作得很好

Catalog catalog = new Catalog();
catalog.setProductName("12 Years a Slave");
catalog.setGenre(genreRepository.get(Long.valueOf(1)));
catalog.setType(typeRepository.get(Long.valueOf(1)));
Session session = cfg.getSession();
Transaction tx = session.beginTransaction();
session.save(catalog);
tx.commit();
session.close();

當然,您可以使用persist(Object obj)將生成的Object保存在數據庫中。 那么,您應該在JUnit測試中測試該函數。 在商業代碼中,它應該做你的DAO。 不,生成了所有ID,您不需要設置ID。 它由Hibernate管理。 對於您的示例,UnitTest應如下所示:

public class DataGenerationTest {

private EntityManager em;

@Before 
public void init(){
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    em = emf.createEntityManager();
}

@Test
public void shouldAddSomeCatalogs(){
em.getTransaction().begin();

Catalog catalog = new Catalog();
catalog.setProductName("Proguct");
catalog.setGenre(new Genre());
catalog.setType(new Type());
em.persist(catalog);
    em.getTransaction().commit();
    em.close();
}
}

(當然你必須從EntityManagerFactory重命名PersistenceUnit測試。它應該與persistence.xml中命名的PersistenceUnit匹配)

其他有趣的講座:

Hiberante會議文件

小例子(GitHub)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM