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)注释了我的类,以便自己处理事务,然后我更改了业务实现:
- 上次保存后,我尝试保存另一个对象:
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);