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 ( 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 吗?

更新:

这段代码工作得很好

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) 将生成的对象保存在数据库中。 那么,您应该在 JUnit 测试中测试该函数。在业务代码中,它应该执行您的 DAO。 不需要,所有的Ids都是生成的,你不需要设置id。它由 Hibernate 管理。 对于您的示例,单元测试应如下所示:

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 Session Doc

Small example (GitHub)

关于java - 如何使用 Hibernate 保存复杂的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22263477/

相关文章:

java - SQL语句对象在哪些情况下会自动关闭?

java - org.springframework.beans.factory.BeanCreationException : NoClassDefFoundError: Could not initialize class org. hibernate.ann

java - Spring Boot - “Error creating bean with name 'entityManagerFactory'” - 启动

Hibernate ClassNotFoundException : org. hibernate.proxy.HibernateProxy

java - 如何设置 Eclipse 代码格式化程序以支持流畅的界面

java - 如何构造JAVA递归方法Dequeue

java - 使用 HibernateTemplate 时无法获取列名称

java - 获取空查询结果后的列名称

java - 根据客户要求流式传输大型存档文件的进展情况?

java - JPanel 之上的 Java 动画