Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠不保存复合键对象_Hibernate_Jboss_Jta - Fatal编程技术网

Hibernate 休眠不保存复合键对象

Hibernate 休眠不保存复合键对象,hibernate,jboss,jta,Hibernate,Jboss,Jta,我遇到了与数据库中的对象持久性相关的问题。 我正在使用这些技术: 爪哇 马文 博士后11.9 Hibernate 5.3.14.Final-redhat-00001 JBoss EAP 7.3 我需要对事务进行容器管理,因此这是我的配置: 我在JBoss standalone.xml配置中声明了一个数据源: 但现在的问题是 我有以下实体: 书 书籍作者 我正试图以以下方式保存这些对象: Session session = HibernateUtil.getSessionFacto

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

  • 爪哇
  • 马文
  • 博士后11.9
  • Hibernate 5.3.14.Final-redhat-00001
  • JBoss EAP 7.3
我需要对事务进行容器管理,因此这是我的配置:

  • 我在JBoss standalone.xml配置中声明了一个数据源:
但现在的问题是

我有以下实体:

  • 书籍作者
我正试图以以下方式保存这些对象:

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);

Book成功保存到db中,Author也保存到db中,但BookHasAuthor未保存。不会引发异常,并且hibernate调试日志信息不会显示任何有关插入的信息

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

  • 我用@TransactionManagement(TransactionManagementType.BEAN)注释了我的类,以便自己处理事务,然后我更改了业务实现:
这很有效!但我需要由容器管理事务,因此这不是我的解决方案

  • 上次保存后,我尝试保存另一个对象:
这很有效,同时保存了BookHasAuthorDAO和Foo

你有什么解决办法吗?这让我快发疯了。 谢谢你们

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", unique = true, nullable = false)
    public int getIdAuthor() {
        return idAuthor;
    }

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

    @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 = "author")
    public Set<BookHasAuthorDAO> getBookHasAuthors() {
        return bookHasAuthors;
    }

    public void setBookHasAuthors(Set<BookHasAuthorDAO> bookHasAuthors) {
        this.bookHasAuthors = bookHasAuthors;
    }
}
@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", nullable = false, 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", nullable = false, insertable = false, 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;
    }
}
@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);

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);