Java 如何使用Hibernate保存复杂对象?

Java 如何使用Hibernate保存复杂对象?,java,hibernate,Java,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

我有三张桌子:

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会话的save()方法)目录对象吗

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(objectobj)
将生成的对象持久化到数据库中。 那么,您应该在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匹配)

其他有趣的讲座:


以及如何在目录对象中设置类型和类型字段?我的意思是如何从表“类型”和“类型”中获取现有数据?可以这样使用吗:Type t=new Type();t、 设置名称(“名称”)?-对,你可以填写每一个领域的流派和类型,它将被保存和映射到数据库中。如果在目录对象中设置数据。在上面的示例中,可以设置Type t=new Type();t、 设置名称(“名称”);目录设置类型(t);em.persist(目录)。。。hibernate将在数据库中保存一个目录对象。以及一个类型对象,其名称与您之前设置的名称相同。要从数据库中获取数据,可以使用Thanx。对于正确持久化的目录对象,我需要首先从DB中获取真正的类型和类型对象。所以我不能仅仅创建具有正确名称param的随机类型并将其添加到目录中。非常有趣。