休眠状态不保存组合键对象

问题描述

我遇到与对象持久化到数据库有关的问题。 我正在使用这些技术:

  • JavaEE
  • 行家
  • Postgres 11.9
  • 休眠5.3.14.Final-redhat-00001
  • JBoss EAP 7.3

我需要对事务进行容器管理,所以这是我的配置:

  • 我已经在我的JBoss standalone.xml配置中声明了一个数据源:
...
<subsystem xmlns="urn:jboss:domain:datasources:5.0">
<datasources>
    ...
    <datasource jndi-name="java:jboss/datasources/PostgresDS" pool-name="PostgresPool" enabled="true">
        <connection-url>jdbc:postgresql://localhost:5432/my-db</connection-url>
        <driver>postgres</driver>
        <security>
            <user-name>postgres</user-name>
            <password>root</password>
        </security>
    </datasource>
    <drivers>
        ...
        <driver name="postgres" module="org.postgres">
            <driver-class>org.postgresql.Driver</driver-class>
        </driver>
    </drivers>
    </datasources>
</subsystem>
  • 我创建了一个HibernateUtil类,它引用了数据源:
private static SessionFactory sessionFactory;
private static Configuration configuration;

public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        sessionFactory = buildSessionFactory();
    }
    return sessionFactory;
}

private static SessionFactory buildSessionFactory() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.connection.datasource","java:jboss/datasources/PostgresDS");
    properties.setProperty("hibernate.show_sql","true");
    
    configuration = new Configuration();
    
    configuration.setProperties(properties);

    addClasses(configuration);

    SessionFactory sessionFactory = configuration.buildSessionFactory();

    return sessionFactory;
}

但现在有问题了...

我有以下实体:

@Entity
@Table(name = "book",schema = "public")
public class BookDAO implements java.io.Serializable {

    private int idBook;
    private String name;
    private Set<BookHasAuthorDAO> bookHasAuthors = new HashSet<BookHasAuthorDAO>(0);

    public BookDAO() {
    }

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "idbook",unique = true,nullable = false)
    public int getIdBook() {
        return idBook;
    }

    public void setIdBook(int idBook) {
        this.idBook = idBook;
    }

    @Column(name = "name",nullable = false,length = 150)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OnetoMany(fetch = FetchType.LAZY,mappedBy = "book")
    public Set<BookHasAuthorDAO> getBookHasAuthors() {
        return bookHasAuthors;
    }

    public void setBookHasAuthors(Set<BookHasAuthorDAO> bookHasAuthors) {
        this.bookHasAuthors = bookHasAuthors;
    }
}
  • 作者
@Entity
@Table(name = "author",schema = "public")
public class AuthorDAO implements java.io.Serializable {

    private int idAuthor;
    private String name;
    private Set<BookHasAuthorDAO> bookHasAuthors = new HashSet<BookHasAuthorDAO>(0);

    public AuthorDAO() {
    }

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "idAuthor",nullable = false)
    public int getIdAuthor() {
        return idAuthor;
    }

    public void setIdAuthor(int idAuthor) {
        this.idAuthor = idAuthor;
    }

    @Column(name = "name",mappedBy = "author")
    public Set<BookHasAuthorDAO> getBookHasAuthors() {
        return bookHasAuthors;
    }

    public void setBookHasAuthors(Set<BookHasAuthorDAO> bookHasAuthors) {
        this.bookHasAuthors = bookHasAuthors;
    }
}
  • BookHasAuthor
@Entity
@Table(name = "book_has_athor",schema = "public")
public class BookHasAuthorDAO implements java.io.Serializable {

    private BookHasAuthorIdDAO id;
    private BookDAO book;
    private AuthorDAO author;
    private int percentage;

    public BookHasAuthorDAO() {
    }

    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name = "idBook",column = @Column(name = "book_idbook",nullable = false)),@AttributeOverride(name = "idAuthor",column = @Column(name = "author_idauthor",nullable = false)) })
    public BookHasAuthorIdDAO getId() {
        return id;
    }

    public void setId(BookHasAuthorIdDAO id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "book_idbook",insertable = false,updatable = false)
    public BookDAO getBook() {
        return book;
    }

    public void setBook(BookDAO book) {
        this.book = book;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "author_idauthor",updatable = false)
    public AuthorDAO getAuthor() {
        return author;
    }

    public void setAuthor(AuthorDAO author) {
        this.author = author;
    }

    @Column(name = "percentage",nullable = false)
    public int getPercentage() {
        return percentage;
    }

    public void setPercentage(int percentage) {
        this.percentage = percentage;
    }
}
  • BookHasAuthorId
@Embeddable
public class BookHasAuthorIdDAO implements java.io.Serializable {

    private int idBook;
    private int idAuthor;

    public BookHasAuthorIdDAO() {
    }

    @Column(name = "book_idbook",nullable = false)
    public int getIdBook() {
        return idBook;
    }

    public void setIdBook(int idBook) {
        this.idBook = idBook;
    }

    @Column(name = "author_idauthor",nullable = false)
    public int getIdAuthor() {
        return idAuthor;
    }

    public void setIdAuthor(int idAuthor) {
        this.idAuthor = idAuthor;
    }
    
    //equals and hashCode implementations
}

我正在尝试以这种方式保存这些对象:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")

session.save(book);

AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");

session.save(author);

BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());

BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);

session.save(bookHasAuthor);

将书成功保存到数据库中,并且也将作者保存到BookHasAuthor中。不会引发任何异常,并且休眠调试日志记录信息不会显示有关插入的任何内容

但是,等等,还不止这些! 我尝试了以下方案:

  • 我用@TransactionManagement(TransactionManagementType.BEAN)注释了我的类,以便自行处理事务,然后更改了业务实现:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();

BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")

session.save(book);

AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");

session.save(author);

BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());

BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);

session.save(bookHasAuthor);

tr.commit();
session.close();

这有效!但是我需要由容器来管理事务,因此这不是我的解决方案。

  • 上次保存后,我试图保存另一个对象:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();

BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")

session.save(book);

AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");

session.save(author);

BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());

BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);

session.save(bookHasAuthor);

Foo foo = new Foo();
foo.setProperty("property");
session.save(foo);

这可行,同时保存BookHasAuthorDAO和Foo。

您有什么解决方案吗?这真让我抓狂。 谢谢你们

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)